Mam trudności z ustaleniem niektórych niuansów między pojedynczymi i podwójnymi cudzysłowami w zmiennym kontekście
Definiuję:
foo=pwd
następnie uruchom te:
echo $'$foo'
Które echo $foo
(co oznacza, że pierwsze $
w moim poleceniu echa zostało usunięte)
echo $"$foo"
To echo pwd
(co oznacza, że bash rozwija $foo
moją zmienną do swojej wartości)
echo $`$foo`
Wreszcie to echo $~/scripts
(spodziewałem się, że zostanie wydrukowane, ~/scripts
a nie $~/scripts
)
czy ktoś może mi pomóc zrozumieć te różnice?
command-line
bash
scripts
Ilan
źródło
źródło
Pierwszy przypadek:
Pierwszy
$
jest uruchamiany jako polecenie. Echo nie wymaga spacji między argumentami, po prostu je zabiera.Zatem echo
$'$foo'
rozwija się, aby uruchomić polecenie$
(które nie jest poleceniem, więc je ignoruje), a następnie echo'$foo'
. Wszystko, co''
jest przyjmowane, ma wartość nominalną - nie rozwija ani nic. Możesz włożyć to, co chcesz ”i nic się nie dzieje.Jeśli wymienić
$
z$$
nim Echos identyfikator procesu.Druga:
To dlatego,
""
że nie zapobiega rozszerzaniu się.""
jest zwykle używany do zapewnienia wartości do porównania.Jeśli masz zmienną, która może być pusta (np. Pochodzi z
grep
wyniku), to chcesz porównać z inną wartością / zmienną, musisz wstawić pierwszą zmienną""
. To gwarantuje, że zawsze jest porównanie do sprawdzenia, a nie tylko pusta sekcja kodu (jak widzi bash), co daje błąd.Wreszcie numer 3. To interesujące.
Jest tak, ponieważ (w tym przypadku) echo drukuje
$
znak jako pierwszy. Umieszczenie czegoś w backticksie powoduje, że wartość zmiennej jest uruchamiana jako polecenie (lepszym sposobem na to w nowszych wersjach bash jest$(command)
)Więc najpierw odbija się echem,
$
a następnie rozwija,`$foo`
do`pwd`
którego jest uruchamiany i powraca~/Scripts
. Ale mieliśmy$
wcześniej wydruk - więc cała produkcja jest$~/Scripts
.źródło