Pierwszy przypadek:
echo $'$foo'
Które echo $foo(co oznacza, że pierwsze $w moim poleceniu echa zostało usunięte)
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:
echo $"$foo"
To echo pwd(co oznacza, że bash rozwija $foomoją zmienną do swojej wartości)
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 grepwyniku), 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.
echo $`$foo`
To echo $~/scripts(spodziewałem się, że zostanie wydrukowane, ~/scriptsa nie $~/scripts)
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.