
Я просматриваю старый скрипт оболочки. Я не могу понять в нем две вещи.
rm /data/log || true
value=$(cat /datafile)
if [ ${value: -1} == 0 ]
then echo 'do'
else echo 'dont'
fi
value: -1
- Что это на самом деле делает?rm /data/log || true
- Что это||true
делает?
решение1
${value: -1}
расширяется допоследний символпеременного содержимого.
${value:-1}
являетсядругойот ${value: -1}
!
Ссылаясь наРасширение параметров оболочкив руководстве:
${value:-1}
расширяется до содержимого переменнойvalue
или, если переменная не установлена или пуста, до строки "1"${value: -1}
— это краткая форма формы${var:offset:length}
для извлечения подстроки содержимого переменной. Смещение-1
означает «один символ от конца строки». Часть:length
отсутствует, поэтому подстрока берется отoffset
до конца строки.В руководстве говорится:
Обратите внимание, что отрицательное смещение должно быть отделено от двоеточия как минимум одним пробелом, чтобы избежать путаницы с расширением «:-».
решение2
rm /data/log || true
полезно только (по моему скромному опыту), если скрипт выполняется с set -e
. set -e
заставляет оболочку выйти, когда команда завершается с состоянием ошибки. Создатель скрипта, по-видимому, не знал о флаге -f
для rm
.
${value: -1}
вероятно, опечатка. Должно быть ${value:-1}
, предоставляя значение по умолчанию (1, а не -1; -
is часть синтаксиса :-
) для расширения переменной, если value
равно null или не установлено.
Если это действительно так ${value: -1}
, посмотрите ответ Гленна Джекмана, чтобы узнать его истинное значение.
решение3
Из bash(1): ${parameter:-word} Использовать значения по умолчанию. Если параметр не установлен или равен null, подставляется расширение слова. В противном случае подставляется значение параметра.
|| true
гарантирует, что команда возвращает значение true. ||
— это сокращенный оператор OR: если команда перед ней возвращает значение false, выполняется команда после нее и используется возвращаемое значение.