Dezorientuj o $ @ w bash - bash

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 № 1

Ogó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 var3itd ..

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 $ ...}