Вопрос или проблема
Если мы определяем переменную с “” как
Var="$1"
Для защиты переменной от оболочки и пробелов, нужно ли использовать переменную с “” или нет? Или, поскольку мы определили Var с “” с самого начала, она устойчива к оболочке и пробелам, даже если мы не используем “” при ее использовании? Например
${Var}
Или
"${Var}"
Это в случае, если $1
содержит специальные символы или пробелы, например, если у нас есть Var="hello world"
, и тогда мы делаем echo $Var
, это выведет их разделенными echo
, затем var
, и также для символов, таких как *
, например, Var="*"
, и мы выполняем echo
var
, это может перечислить все директории вместо просто *
Ответ или решение
В данной статье мы подробно разберём вопрос использования переменной в Bash, и необходимость указания кавычек при её вызове. Пример сценария, который мы рассмотрим, – это случай, когда мы инициализируем переменную Var
с помощью первого аргумента скрипта $1
, а затем проводим операции её обработки.
Инициализация переменной
Var="$1"
В данном коде переменная Var
инициализируется значением, переданным в качестве первого параметра скрипта. Использование кавычек ""
при этом этапе защиты переменной от нежелательного поведения, такого как "глоблинг" (разделение по пробелам и подстановки символов), является важным аспектом. Однако это только первый шаг.
Защита от глазящего и пробелов
Существует распространённое заблуждение, что, если переменная определена с кавычками, то её можно использовать всегда без кавычек. Это не совсем так. Когда вы ссылаетесь на переменную, важно понимать, как она будет интерпретироваться оболочкой.
Рассмотрим два примера использования переменной Var
с и без кавычек:
-
Без кавычек:
echo $Var
В этом случае значение переменной
Var
может быть интерпретировано оболочкой, что может привести к нежелательным последствиям, особенно если оно содержит пробелы или специальные символы. Например, еслиVar="hello world"
, то командаecho $Var
выведет:hello world
То есть, вывод будет разбит на два слова.
-
С кавычками:
echo "$Var"
В этом варианте значение переменной будет передано команде
echo
как единое целое, что предотвратит разбиение на части. Исходный вывод в этом случае будет:hello world
Влияние специальных символов
Допустим, вы присвоили переменной Var
значение, содержащее специальный символ, такой как *
:
Var="*"
echo $Var
При этом в командной строке echo
, не обернутой в кавычки, у нас произойдёт "глоблинг", и вместо *
будут выведены все файлы и каталоги текущей директории. Для предотвращения этого очень важно использовать кавычки:
echo "$Var"
Этот код корректно выведет просто *
, без каких-либо неожиданных подстановок.
Заключение
Итак, чтобы защитить значение переменной Var
от неожиданных последствий, таких как "глоблинг" и деление по пробелам, рекомендуется всегда использовать кавычки при ссылке на переменную:
"${Var}"
гарантирует, что переменная будет интерпретироваться точно так, как была задана, без расщепления или подстановки специальных символов.
Используйте данную практику во избежание ошибок и для более надёжного написания скриптов, что в свою очередь улучшит их читаемость и поддержку.