Entah saya melewatkan beberapa serangan balik atau serangan balik tampaknya tidak bekerja dengan terlalu banyak programmer-quote-looping.
$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"
hello1-hello2-hello3-echo hello4
Ingin
hello1-hello2-hello3-hello4-hello5-hello6-...
deprecated
Oleh karena itu, gunakanlah backtick$(cmd)
.Jawaban:
Gunakan
$(commands)
sebagai gantinya:$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" hello1-hello2-hello3-hello4
$(commands)
melakukan hal yang sama seperti backtick, tetapi Anda dapat menumpuknya.Anda mungkin juga tertarik dengan perluasan rentang Bash:
echo hello{1..10} hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
sumber
jika Anda bersikeras untuk menggunakan backticks, berikut bisa dilakukan
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
Anda harus meletakkan garis miring terbalik,
\\ \\\\ \\\\\\\\
sebanyak 2x dan seterusnya, itu sangat jelek, gunakan$(commands)
seperti yang disarankan lainnya.sumber
Kapan pun Anda ingin mengevaluasi penggunaan perintah
command substitution
:$(command)
Kapan pun Anda ingin mengevaluasi ekspresi aritmatika, gunakan
expression substitution
:Anda dapat menyusunnya seperti ini:
Misalkan file1.txt panjangnya 30 baris dan file2.txt 10 baris, daripada Anda dapat mengevaluasi ekspresi seperti ini:
yang akan menghasilkan 20 (perbedaan jumlah baris antara dua file).
sumber
Jauh lebih mudah jika Anda menggunakan
$(cmd)
sintaks substitusi perintah bash , yang jauh lebih ramah untuk disarangkan:$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" hello1-hello2-hello3-hello4
sumber
Terkadang bersarang backtick dapat diganti dengan
xargs
dan pipa$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 hello1 hello2 hello3 hello4
Kelemahan dari solusi ini adalah:
Semua argumen menjadi dipisahkan spasi (dapat diselesaikan dengan
tr
):$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-' hello1-hello2-hello3-hello4
Mari tunjukkan kasus penggunaan nyata.
Perintah berikut berfungsi di bash, tetapi tidak di tcsh (penyarangan backtick tidak ditangani dengan baik di tcsh)
$ ls $(dirname $(which bash)) $ ls `dirname \`which bash\``
Mereka bisa diganti dengan
$ which bash | xargs dirname | xargs ls
sumber