Różnica między $ „$ foo” a $ „$ foo”

9

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 $foomoją zmienną do swojej wartości)

echo $`$foo`

Wreszcie to echo $~/scripts(spodziewałem się, że zostanie wydrukowane, ~/scriptsa nie $~/scripts)

czy ktoś może mi pomóc zrozumieć te różnice?

Ilan
źródło

Odpowiedzi:

11

Ostatecznie drukowany jest ostatni, $~/scriptsponieważ $`foo`jest kombinacją literału, $po którym następuje podstawienie polecenia; więc wiodący $jest interpretowany jako dosłowny, $a końcowy `$foo`jako podstawienie polecenia.

kos
źródło
Usunąłem tagi kodu i zastępuję je tylko znakami `` `` `` `itd. Itp. Zapraszam do wycofania, jeśli wolisz tagi kodu
Tim
@Tim Dzięki, nie jestem pewien, co dokładnie zrobiłem, ale z jakiegoś powodu po tym, jak edytowałeś post, pojawił się tak samo zakłócony jak w mojej pierwszej wersji, więc wycofałem go ... I teraz widzę, że wygląda dobrze w wersji. Nie jestem pewien, co się stało, przetestuję to w piaskownicy formatującej przed przywróceniem wersji, ponieważ obawiam się, że mógłbym ponownie zakłócić publikację. Niezależnie od tego, dziękuję za wysiłek.
Kos
jasne, żadnych problemów. Mój używa spacji o zerowej szerokości, więc zachowaj ostrożność podczas edycji.
Tim
2

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.

Tim
źródło
Niezła praca nad bardzo trudnym formatowaniem!
Arroniczny
1
@Arronical Thanks :) Nie możesz tego zobaczyć, ale jest tam spacja o zerowej szerokości dla ostatniego zdania. Rzeczy, które robię dla wyimaginowanych punktów internetowych ...!
Tim
1
+1 Dobra odpowiedź. Dodałbym tylko, że zmienne cytowania powinny być domyślne, chyba że masz konkretny powód, aby tego nie robić - nie tylko do obsługi możliwych wartości zerowych. Zobacz unix.stackexchange.com/questions/171346/..., aby uzyskać więcej niż kiedykolwiek chciałeś o tym wiedzieć. ;)
Joe