Po pierwsze, prosta sytuacja, echo "$@"
bezpośrednio w pętli for:
#!/bin/bash
set -- "First one" "second" "third:one" "" "Fifth: :one"
IFS=:
# IFS=":", using "$@"
c=0
for i in "$@"
do echo "$((c+=1)): [$i]"
done
Wynik, zgodnie z oczekiwaniami:
1: [First one]
2: [second]
3: [third:one]
4: []
5: [Fifth: :one]
Ale kiedy przypiszę "$@"
do zmiennej var
a następnie echo $var
w pętli for rzeczy stają się skomplikowane:
#!/bin/bash
set -- "First one" "second" "third:one" "" "Fifth: :one"
IFS=:
# IFS=":", using $var (var="$@")
var="$@"
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
To Drukuj:
1: [First one second third]
2: [one Fifth]
3: [ ]
4: [one]
Dlaczego dane wyjściowe uległy zmianie? Czy ktoś może mi powiedzieć, co się stało pod maską, kiedy dodam var="$@"
a następnie echo $var
w pętli for?
Odpowiedzi:
1 dla odpowiedzi № 1Ogólnie, podczas uruchamiania skryptu, argumenty podane w wierszu poleceń (wywołane parametry pozycyjne) są dostępne w skrypcie jako "$1"
, "$2"
, etc ... Lista parametrów pozycyjnych zawarta jest w specjalnej zmiennej powłoki $@
(a także w $*
). Szczególna własność $@
to jest, gdy cytowany (np. "$@"
) zachowa cytowaną zależność parametrów pozycyjnych. (np. jeśli argument jest podany jako "First one"
, $@
utrzymuje go jako pojedynczy argument w przeciwieństwie do dwóch)
Istnieje jednak również metoda ustawiania parametrów pozycyjnych za pomocą skryptu powłoki set -- var1 var2 var3
itd ..
IFS
jest wewnętrznym separatorem pól, który kontroluje dzielenie słów. (w ten sposób łańcuchy są dzielone na słowa - domyślnie: space tab newline
) Zmiana IFS=:
powoduje podział słów na miejsce ":"
znak zamiast domyślnego.
Tak więc w twoim przypadku masz nowe parametry pozycyjne "First one" "second" "third:one" "" "Fifth: :one"
ustawić i jeśli spojrzysz na to, gdzie się złamią, jeśli podzielone na każdego ":"
postać, otrzymujesz:
"First one second third"
"one Fifth"
" "
"one"
Zagadka rozwiązana. To dobry przykład, aby nauczyć się o parametrach pozycyjnych i wewnętrznym separatorze pól wraz z ich wpływem na dzielenie słów. Dowiedz się - ważne jest tworzenie skryptów powłoki.
2 dla odpowiedzi nr 2
od: Jakie są specjalne zmienne powłoki znaku dolara?
"$ @" to tablicowa konstrukcja wszystkich parametrów pozycyjnych, {1 $, 2 $, 3 $ ...}