Saya relatif baru untuk shell scripting, tetapi hampir menyelesaikan skrip yang menggunakan program lftp . Bagian dari skrip yang saya mengalami masalah adalah ketika saya membuat string panjang perintah (dipisahkan oleh ;
).
for var in something
do
...
commands_to_run+="echo Result is `tail -n 1 $somefile`;"
done
Apa yang saya perhatikan adalah bahwa tail
program - dibungkus dengan backticks - sedang dijalankan ketika for loop berulang, tetapi tidak ketika saya memanggil string perintah nanti dalam skrip saya.
Sayangnya, isi $ somefile belum siap untuk diperiksa. Bagaimana saya bisa mendapatkan perintah untuk dieksekusi ketika saya membutuhkannya, dan tidak saat saya membuat string?
sumber
$(...)
seperti yang disarankan Hauke tetapi backslash adalah kuncinya.eval
karena Anda dapat melakukan hal yang sama dengan tidak melarikan diri$
dan menggunakan tanda kutip tunggal ('
) daripada tanda kutip ganda ("
) untuk mengelilingi perintah Anda.echo
string dengan konten termasuk output dari perintah bersarang eksekusi tertunda.echo
tidak akan bekerja karena tidak ada perintaheval
, tetapi sebuah string. Jika Anda memiliki contoh yang lebih relevan bagi kami, kami dapat mencoba membantu.Ada beberapa tingkatan kutipan. Tanda kutip ganda (
"..."
) spasi melindungi dan beberapa karakter khusus (~
,&
,|
,;
, ...) tetapi tidak mencegah perluasan parameter dan substitusi perintah.Anda memerlukan tanda kutip tunggal (
'
) atau garis miring terbalik di depan karakter "berbahaya".Secara umum: Anda harus mempertimbangkan untuk menggunakan
$(tail ...)
backticks. Backticks adalah standar yang lebih tua tetapi kita berbicara tentang yang sudah terlalu tua sehingga$()
tidak menimbulkan masalah bagi kebanyakan orang. Versi baru lebih mudah dibaca dan dapat disarangkan. Jangankan masalah pemformatan di sini di sx ...sumber
$(...)
masih menghasilkan hasil yang sama - shell mengeksekusi ini ketika string saya didefinisikan.$()
tetapi Anda tetap membutuhkan tanda kutip tunggal.