Я нашел скрипт, который имеет функцию, которая проверяет, установлена ли переменная, но я не очень хорошо ее понимаю.
check_if_variable_is_set() {
var_name=$1
if [ -z "${!var_name+x}" ]; then
false
else
true
fi
}
Что именно происходит с этой заменой?
bash
shell-script
variable-substitution
Карим Манауй
источник
источник
Ответы:
В
bash
оболочке${!var}
есть переменная косвенность. Он расширяется до значения переменной, имя которой хранится в$var
.Расширение переменной
${var+value}
- это расширение POSIX, которое расширяется,value
если переменнаяvar
установлена (независимо от того, является ли ее значение пустым или нет).Комбинируя их,
${!var+x}
можно расширить,x
если переменная, имя которой хранится,$var
установлена.Пример:
(пустая строка в качестве вывода)
Функция в вопросе может быть сокращена до
или даже:
или даже:
Где
-v
этоbash
испытание на имя переменной , которая будет верно , если названная переменная установлена, и ложь в противном случае.POSIXly, это может быть написано:
Обратите внимание, что все это потенциальные уязвимости при внедрении команд, если аргумент этой функции может оказаться под контролем злоумышленника. Попробуйте, например, с
check_if_variable_is_set 'a[$(id>&2)]'
.Чтобы избежать этого, вы можете сначала проверить, что аргумент является допустимым именем переменной. Для переменных:
(обратите внимание, что в вашей локали
[[:alpha:]]
будет проверяться наличие буквенных символов, в то время как некоторые оболочки принимают только буквенные символы из переносимого набора символов в их переменной)источник