Perbedaan antara $ '$ foo' dan $ “$ foo”

9

Saya mengalami kesulitan menemukan beberapa nuansa antara tanda kutip tunggal dan ganda dalam konteks variabel

Saya mendefinisikan:

foo=pwd

kemudian jalankan ini:

echo $'$foo'

Yang gema $foo(artinya yang pertama $dalam perintah gema saya dijatuhkan)

echo $"$foo"

Gema ini pwd(yang berarti bash mengembang $foo, variabel saya, hingga nilainya)

echo $`$foo`

Akhirnya gema ini $~/scripts(saya berharap untuk mencetak ~/scriptsdan tidak $~/scripts)

dapatkah seseorang membantu saya mengetahui perbedaan-perbedaan ini?

Ilan
sumber

Jawaban:

11

Pada akhirnya, yang terakhir dicetak $~/scriptskarena $`foo`merupakan kombinasi dari literal $diikuti oleh substitusi perintah; jadi pemimpin $ditafsirkan sebagai literal $dan trailing `$foo`sebagai substitusi perintah.

kos
sumber
Saya menghapus tag kode dan menggantikannya hanya dengan karakter `` `` `` `` dll. Jangan ragu untuk mengembalikannya jika Anda lebih suka tag kode
Tim
@Tim Terima kasih, tidak yakin apa yang saya lakukan persis tetapi karena beberapa alasan setelah diedit pos Anda muncul sama terganggunya dengan pada revisi pertama saya, jadi saya memutar kembali ... Dan sekarang saya melihatnya terlihat ok di revisi. Tidak yakin apa yang terjadi, akan menguji ini di kotak pasir format sebelum kembali ke versi Anda karena saya khawatir saya akan mengganggu posting lagi. Apapun, terima kasih atas usahanya.
kos
tentu, tidak ada masalah. Milik saya menggunakan spasi nol-lebar, jadi berhati-hatilah saat Anda mengedit.
Tim
2

Kasus pertama:

echo $'$foo'

Yang gema $foo(artinya yang pertama $dalam perintah gema saya dijatuhkan)

Yang pertama $dijalankan sebagai perintah. Echo tidak membutuhkan spasi di antara argumen, hanya membutuhkannya.

Jadi gema $'$foo'mengembang untuk menjalankan perintah $(yang bukan perintah sehingga mengabaikannya) lalu gema '$foo'. Apa pun yang ''ada diambil pada nilai nominal - tidak memperluas atau apa pun. Anda dapat memasukkan apa yang Anda inginkan '' dan tidak ada yang terjadi.

Jika Anda mengganti $dengan $$itu menggemakan ID proses.


Kedua:

echo $"$foo"

Gema ini pwd(yang berarti bash mengembang $foo, variabel saya, hingga nilainya)

Itu karena ""tidak mencegahnya berkembang. ""biasanya digunakan untuk memastikan ada nilai untuk dibandingkan.

Jika Anda memiliki variabel yang bisa kosong (misalnya dari grephasil) maka Anda ingin membandingkan dengan nilai / variabel lain, Anda harus memasukkan variabel pertama "". Ini memastikan bahwa selalu ada perbandingan untuk diperiksa, bukan hanya bagian kode yang kosong (seperti yang dilihat bash) yang memberikan kesalahan.


Akhirnya, nomor 3. Ini menarik.

echo $`$foo`

Gema ini $~/scripts(saya berharap untuk mencetak ~/scriptsdan tidak $~/scripts)

Itu karena (dalam hal ini) gema mencetak $karakter terlebih dahulu. Menempatkan sesuatu di backticks menyebabkan nilai variabel dijalankan sebagai perintah (cara yang lebih baik untuk melakukannya di versi bash yang lebih baru adalah $(command))

Jadi pertama-tama gema $kemudian diperluas ​`$foo`​ke ​`pwd`​mana dijalankan dan kembali ~/Scripts. Tapi kami sudah $mencetak sebelumnya - jadi seluruh hasilnya $~/Scripts.

Tim
sumber
Kerja bagus pada beberapa format yang sangat sulit!
Arronical
1
@Arronical Trims :) Anda tidak dapat melihatnya tetapi ada beberapa spasi nol-lebar di sana untuk kalimat terakhir. Hal-hal yang saya lakukan untuk poin internet imajiner ...!
Tim
1
+1 Jawaban yang bagus. Saya hanya akan menambahkan bahwa variabel kutipan harus menjadi default kecuali jika Anda memiliki alasan khusus untuk tidak - tidak hanya menangani kemungkinan nilai nol. Lihat unix.stackexchange.com/questions/171346/… untuk lebih dari yang Anda ingin tahu tentang ini. ;)
Joe