Linux: zmienne podwójnego cudzysłowu i pętla plików

0

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, filez $workingdir/*którą nie jest to, czego chcę.

Dziękuję Ci.

pozdrowienia

Lennelei
źródło
Czy są jakieś przykłady tego, co powinno się wydarzyć, a co faktycznie się wydarzyło dla danych plików?
Xen2050,
Właściwie to, co się dzieje, jest tym, czego chcę: nie mam problemu z kodem. Chciałbym mieć pewność, że jest to właściwy sposób, aby to zrobić, ponieważ nadal nie znam zbyt dobrze stosowania podwójnych cudzysłowów wokół zmiennych.
lennelei
Spróbuj użyć zmiennej (tutaj nazwa pliku?), Która ma spacje i znaki nowej linii, a następnie zobacz, co się stanie, cytowanie zwykle pozwala uniknąć tego rodzaju problemów. Może chciałbym zacytować również w [[/ teście
Xen2050,

Odpowiedzi:

0

Pierwszy podany przykład jest poprawny (zakładając, że oznacza to oczywistą rzecz):

for file in "$workingdir"/*; do

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:

if [[ $workingdir == $variable* ]]; then

W takim przypadku wartość zmiennej variablebędzie traktowana jako wzorzec, a nie stały ciąg. Na przykład, jeśli variableustawiono na „* foo”, ogólny warunek będzie zgodny, jeśli $workingdirw dowolnym miejscu zawiera „foo”. Jeśli chcesz $variablebyć 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):

if [[ $workingdir == "$variable"* ]]; then

... 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ć:

if [[ "$workingdir" == "$variable"* ]]; then
Gordon Davisson
źródło
0

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ępnie my directory/*(w postaci pojedynczego słowa) tekstu po procesie rozpadu, a następnie my directory/file1, my directory/file2po rozprężeniu nazw.

ksenoid
źródło