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


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.