Shell Anda menafsirkan kutipan, baik '
dan "
, bahkan sebelum mereka sampai echo
. Saya biasanya hanya menempatkan tanda kutip ganda di sekitar argumen saya untuk bergema bahkan jika mereka tidak perlu; sebagai contoh:
$ echo "Hello world"
Hello world
Jadi, dalam contoh pertama Anda, jika Anda ingin menyertakan tanda kutip literal dalam output Anda, mereka juga harus diloloskan:
$ echo \'Hello world\'
'Hello world'
Atau mereka harus digunakan dalam argumen yang sudah dikutip (tetapi itu tidak bisa menjadi jenis kutipan yang sama, atau Anda akan perlu menghindarinya):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
Dalam contoh kedua, Anda menjalankan substitusi perintah di tengah-tengah string:
grep $ARG /var/tmp/setfile | awk {print $2}
Hal-hal yang mulai dengan $
juga ditangani secara khusus oleh shell - itu memperlakukan mereka sebagai variabel dan menggantinya dengan nilai-nilai mereka. Karena kemungkinan besar variabel-variabel tersebut tidak diatur dalam shell Anda, sebenarnya hanya berjalan
grep /var/tmp/setfile | awk {print}
Karena grep
hanya melihat satu argumen, diasumsikan bahwa argumen adalah pola yang Anda cari, dan bahwa tempat itu seharusnya membaca data adalah stdin, sehingga memblokir menunggu input. Itu sebabnya perintah kedua Anda tampaknya hang.
Ini tidak akan terjadi jika Anda mengutip argumen tersebut (itulah sebabnya contoh pertama Anda hampir berhasil), jadi ini adalah salah satu cara untuk mendapatkan hasil yang Anda inginkan:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
Anda juga dapat mengutip dua kali, tetapi Anda harus keluar dari $
s sehingga shell tidak menyelesaikannya sebagai variabel, dan backticks agar shell tidak segera menjalankan substitusi perintah:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"