Saya mengikuti panduan skrip bash shell ini:
Di bagian Perbandingan Numerik, ia mengutip sebuah contoh:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
Apa yang tampaknya terjadi di atas adalah kita menyimpan serangkaian perintah dalam variabel bash dan kemudian kita memanggil gema pada variabel. Apa yang tampaknya terjadi adalah string dievaluasi dan perintah wc dieksekusi dan mengembalikan jumlah baris ke terminal pengendali.
Ok, jadi saya meluncurkan terminal saya di Ubuntu 12.04 dan mencoba sesuatu yang serupa:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
Tunggu sebentar, itu tidak mengevaluasi string dan mengembalikan jumlah baris. Itu baru saja menggemakan string kembali ke terminal. Mengapa saya mendapatkan hasil yang berbeda?
command-line
bash
scripts
JohnMerlino
sumber
sumber
wc -l work.txt
, melainkan diberi nomor 201.Jawaban:
Anda perlu menggunakan backticks untuk mengevaluasi ekspresi.
Jika Anda hanya ingin melihat "1" di output, gunakan perintah
Dan juga berfungsi:
Untuk informasi tambahan, lihat Perbedaan antara doublequotes "", singlequotes '' dan backticks ´ ´ pada commandline?
sumber
wc
kerja perintah. Cobacat sample.txt | wc -l
.Harap perhatikan simbol itu:
Kutipan tunggal
dan
Backquote
Jadi Backquote mengembalikan hasil perintah ke Output Standar. Itulah mengapa
mengembalikan hasil perintah, sementara
cukup kembalikan "wc -l sample.txt" sebagai string biasa
Pertimbangkan untuk melakukan ini sebagai contoh:
Dan sekarang gema ketiga variabel:
sumber
Jika Anda ingin menangkap output dari suatu perintah dalam variabel, Anda harus menggunakan backticks
``
atau menyertakan perintah di$()
:Perhatikan bahwa string sebenarnya dievaluasi pada saat deklarasi variabel, bukan ketika Anda menggemakannya. Perintah ini sebenarnya dijalankan di dalam
$()
atau backticks dan output dari perintah itu disimpan sebagai nilai variabel.Secara umum, Anda harus selalu menggunakan
$()
bukannya backticks yang sudah usang dan hanya ada untuk alasan kompatibilitas dan jauh lebih terbatas. Anda tidak bisa, misalnya, perintah sarang dalam backticks tetapi Anda bisa dengan$()
:Lihat utas ini di U&L untuk beberapa perincian lebih lanjut mengapa
``
harus dihindari.sumber
$(
)
untuk`
`
. Tapi seperti wag mengatakan , backquotes lakukan sarang.echo $(date -d $(echo yesterday))
menjadiecho `date -d \`echo yesterday\``
;echo $(echo $(date -d $(echo yesterday)))
menjadiecho `echo \`date -d \\\`echo yesterday\\\`\``
. Saya mengatakan ini tidak membantah tesis Anda tetapi untuk memperkuatnya : lolos dari backquotes internal membuat`
`
sintaksis lebih kuat daripada yang sering diakui, tetapi perlakuan khusus\
aneh, mengejutkan, dan sulit untuk dipikirkan . Dengan$(
)
apa yang Anda lihat biasanya apa yang Anda dapatkan.