Цитуйте змінну в оболонці оператора "if"


9

напр

if [ "$FOO" = "true" ]; then

проти

if [ $FOO = "true" ]; then

Чим відрізняється? Здається, обидва твердження також спрацьовують.


У Bash використовуйте подвійні квадратні дужки, і вам не потрібні цитати, і ви отримуєте додаткові переваги .
Призупинено до подальшого повідомлення.

@DennisWilliamson Не зовсім, вам потрібні котирування з правого боку операторів рівності (і) рівності та відповідності шаблонів.
Жил "ТАК - перестань бути злим"


@Gilles: Іноді ні. Для текстових рядків , що містять пробіли або для текстових рядків або змінних , які містять Глоб символи , які ви хочете , щоб в буквальному сенсі , права сторона повинна бути вказана: a='foo bar'; [[ $a == "foo bar" ]]. Однак, змінна , яка не містить Глоб символи не повинні бути: [[ $a == $a ]]. Розширення слова не виконується всередині подвійних квадратних дужок. А для збігу регулярних виразів шаблон у правій частині не повинен бути цитованим, або він буде прийнятий як буквальний рядок: [[ $a =~ .*oo.*r ]](шаблон повинен бути в нецитованій змінній, однак замість цього ...
Призупинено до подальшого повідомлення.

включення буквально як тут). Для Глоб стилю зіставлення з зразком, символи GLOB не повинні бути укладені в лапки, то чи буквальний або в змінної: [[ $a == foo* ]]. Чи можете ви надати будь-які додаткові приклади вимоги до цитування, окрім мого буквального прикладу рядка?
Призупинено до подальшого повідомлення.

Відповіді:


6

Якщо значення $FOO- це одне слово, яке не містить символу підстановки \[*?, то два ідентичні.

Якщо $FOOце не призначено, або порожнє, або більше одного слова (тобто містить пробіл або $IFS), то версія без котирування - це синтаксична помилка. Якщо це буде правильна послідовність слів (наприклад 0 -eq 0 -o false), результат може бути довільним. Тому, добре застосовувати завжди змінні в скриптах оболонки.

Між іншим, "true"не потрібно цитувати.


3

Щоб проілюструвати, які проблеми це може спричинити, ось кілька прикладів.

Скажімо, у нас є дві змінні:

FOO="some value"
BAR="some value"

Тепер у нас є дві змінні, що містять абсолютно однаковий рядок / значення. Якщо ми зробили кілька, якщо заяви перевірити результат, у вашому випадку:

if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi

У цей момент ви отримаєте bash: [: too many arguments. Не котирується $ FOO тепер містить три значення, а саме '[ , some , value'. [тестове ключове слово не знає, що потрібно виконати, оскільки він очікує, що перший або другий аргумент буде оператором.

Коли ми цитуємо "$ FOO", ми прямо заявляємо ifподивитися правильні значення, де не відбувається розщеплення слів.

Ще один приклад:

my_file="A random file.txt"
  • робити rm $my_fileозначає видалити 'A' 'random' 'file.txt', який робить його три файли.
  • при цьому rm "$my_file"буде видалено "Випадковий file.txt", який створює один файл.

Сподіваюся, я не переплутав вас із цими прикладами.


0

У цьому конкретному випадку різниці немає.

Однак якщо $FOOміститься пробіл або якісь спеціальні символи, у вас виникне проблема.

У "$FOO"випадку, вона буде використовувати змінну в цілому, щоб зробити відповідність ізолюючи вас від космічної проблеми.

Однак, якщо ви використовуєте $FOOі є окремий випадок, це вплине на оператор if.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.