Я читаю последнюю строку файла в переменную. Затем я хочу получить последние X символов строковой переменной:
#!/bin/bash
someline="this is the last line content"
echo ${someline}
somepart=${someline: -5}
echo ${somepart}
Выполнить с: sh lastchars.sh
Результат:
this is the last line content
line 4: Bad substitution
Что может быть не так? здесь?
Похоже, вы вообще не используете bash
. Я могу воспроизвести только ту ошибку, которую вы показываете, если я использую dash
вместо bash
:
bash
:
$ line="someline content"
$ echo ${line}
someline content
$ lastchars=${line: -5}
$ echo ${lastchars}
ntent
dash
:
$ line="someline content"
echo ${line}
lastchars=${line: -5}
echo ${lastchars}
$ someline content
$ dash: 3: Bad substitution
Ваша линия Шебанга указывает на bash
, но вы запускаете скрипт с sh
, поэтому шебанг игнорируется /bin/sh
в системах Ubuntu на самом деле - dash
, минимальная оболочка, которая не поддерживает синтаксис, который вы пытаетесь использовать.
При использовании строки shebang нет причин явно вызывать оболочку для скрипта, просто сделайте ее исполняемой (chmod a+x /path/to/script.sh
) и запускайте ее без указания интерпретатора:
/path/to/script.sh
В качестве альтернативы просто используйте правильный:
bash /path/to/script.sh
Очевидно, что использование встроенных функций определенной оболочки неплохо, но вы также можете выполнить задачу, используя стандартные команды UNIX, поэтому она будет работать в любой оболочке:
String="This is some text"
StrLen=`echo ${String} | wc -c`
From=`expr $StrLen - 5`
echo $String | cut -c${From}-${StrLen}