W innym pytaniu poradzono mi, aby „podwójnie zacytować zmienne $” w moim skrypcie, aby uniknąć błędów.
Po przeczytaniu wielu informacji na temat podwójnych cudzysłowów, zakładam, że mogę / muszę wykluczyć symbole wieloznaczne z podwójnego cudzysłowu, gdy potrzebuję (na przykład), aby przeglądać pliki, ale chciałbym mieć pewność.
Czy możesz mi powiedzieć, czy oba poniższe zastosowania są poprawnym zastosowaniem podwójnych cudzysłowów?
for file in "$workingdir"/*; do
#do something with $file
done
if [[ $workingdir == $variable* ]]; then
#do something
fi
W przypadku tego, co widziałem w moich testach, użycie "$workingdir/*"
spowoduje ustawienie zmiennej, file
z $workingdir/*
którą nie jest to, czego chcę.
Dziękuję Ci.
pozdrowienia
linux
bash
bash-scripting
Lennelei
źródło
źródło
Odpowiedzi:
Pierwszy podany przykład jest poprawny (zakładając, że oznacza to oczywistą rzecz):
Powoduje to iterację listy plików w katalogu odpowiadających wartości zmiennej
workingdir
, i działa, nawet jeśli zawiera spacje lub inne zabawne znaki.Drugi przykład jest jednak bardziej skomplikowany:
W takim przypadku wartość zmiennej
variable
będzie traktowana jako wzorzec, a nie stały ciąg. Na przykład, jeślivariable
ustawiono na „* foo”, ogólny warunek będzie zgodny, jeśli$workingdir
w dowolnym miejscu zawiera „foo”. Jeśli chcesz$variable
być traktowany jako ciąg znaków, a nie dosłownym wzór, można ponownie umieścić go w cudzysłów (ale nie*
, zakładając, że chcesz to traktować jako zamiennika):... i szczerze mówiąc, śledzenie, gdzie ważne są zmienne podwójnego cytowania, a gdzie nie, to więcej kłopotów niż jest warte. (tzn. można bezpiecznie zostawić je po lewej stronie
=
lub w==
środku[[ ]]
- ale nie po prawej stronie lub w środku[ ]
). Dlatego zalecam podwójne cytowanie ich wszędzie, abyś nie musiał tak ściśle śledzić:źródło
Rozwijanie nazw plików odbywa się po dzieleniu słów (o co chodzi w podwójnych cudzysłowach ...).
Tak więc
"$mydir"/*
rozszerza się"my directory"/*
po zmiennym podstawienia, a następniemy directory/*
(w postaci pojedynczego słowa) tekstu po procesie rozpadu, a następniemy directory/file1
,my directory/file2
po rozprężeniu nazw.źródło