na przykład
if [ "$FOO" = "true" ]; then
vs
if [ $FOO = "true" ]; then
Czym się różni? Wydaje się, że oba te stwierdzenia również działają.
bash
shell
shell-script
quoting
Ryan
źródło
źródło
a='foo bar'; [[ $a == "foo bar" ]]
. Jednak zmienna, która nie zawiera znaków glob nie musi być:[[ $a == $a ]]
. Rozwijanie wyrazów nie jest wykonywane w nawiasach kwadratowych. I dla regex dopasowywania, wzór na prawej stronie nie mogą być notowane lub będzie ona traktowana jako dosłowne wyrażenie:[[ $a =~ .*oo.*r ]]
(wzór powinien być w zmiennej un cytowany jednak zamiast ...[[ $a == foo* ]]
. Czy możesz podać jakieś dodatkowe przykłady wymogu cytowania oprócz mojego przykładu literału?Odpowiedzi:
Jeśli wartością
$FOO
jest pojedyncze słowo, które nie zawiera znaku wieloznacznego\[*?
, oba są identyczne.Jeśli
$FOO
jest nieprzypisane, puste lub zawiera więcej niż jedno słowo (tzn. Zawiera spacje lub$IFS
), wówczas wersja bez cudzysłowu jest błędem składni. Jeśli zdarzy się, że jest to właściwa sekwencja słów (np.0 -eq 0 -o false
), Wynik może być dowolny. Dlatego dobrą praktyką jest zawsze cytowanie zmiennych w skryptach powłoki.Nawiasem mówiąc,
"true"
nie trzeba cytować.źródło
Aby zilustrować problemy, które może powodować, oto kilka przykładów.
Powiedzmy, że mamy dwie zmienne:
Teraz mamy dwie zmienne posiadające dokładnie ten sam ciąg / wartość. Jeśli zrobiliśmy kilka instrukcji if w celu przetestowania wyniku, w twoim przypadku:
W tym momencie dostaniesz
bash: [: too many arguments
. Nienotowany $ FOO ma teraz trzy wartości, a mianowicie'[ , some , value'
.[
słowo kluczowe test nie wie, co wykonać, ponieważ oczekuje, że pierwszym lub drugim argumentem będzie operator.Kiedy cytujemy „$ FOO”, wyraźnie mówimy
if
o sprawdzeniu właściwych wartości, w których nie dochodzi do podziału słów.Inny przykład:
rm $my_file
oznacza usuwanie „losowego” pliku.txt, co czyni go trzema plikami.rm "$my_file"
usunie „Losowy plik.txt”, który utworzy jeden plik.Mam nadzieję, że nie pomyliłem cię z tymi przykładami.
źródło
W tym konkretnym przypadku nie ma różnicy.
Jeśli jednak
$FOO
zawiera spację lub znaki specjalne, będziesz mieć problem.W takim
"$FOO"
przypadku użyje zmiennej ogółem, aby dopasowanie dopasowało Cię do problemu z przestrzenią.Jeśli jednak użyjesz
$FOO
i istnieje specjalny przypadek, wpłynie to na instrukcję if.źródło