Назначение двоеточия в расширении переменной

Назначение двоеточия в расширении переменной

Я просматриваю старый скрипт оболочки. Я не могу понять в нем две вещи.

rm /data/log || true

value=$(cat /datafile)
if [ ${value: -1} ==  0 ] 
 then echo 'do'
else echo 'dont'
 fi
  1. value: -1- Что это на самом деле делает?
  2. rm /data/log || true- Что это ||trueделает?

решение1

${value: -1}расширяется допоследний символпеременного содержимого.

${value:-1}являетсядругойот ${value: -1}!

Ссылаясь наРасширение параметров оболочкив руководстве:

  1. ${value:-1}расширяется до содержимого переменной valueили, если переменная не установлена ​​или пуста, до строки "1"

  2. ${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, выполняется команда после нее и используется возвращаемое значение.

Связанный контент