(6 jawaban)
Tutup 6 tahun yang lalu.
Ini adalah bagian dari bash find
loop, dan saya bertanya-tanya sintaks mana yang lebih benar dan mengapa?
filename="$(echo "$i" | cut -c5-)";
filename=`echo "$i" | cut -c5-`;
Keduanya berfungsi untuk tujuan mendapatkan nama file.
Jawaban yang Diterima:
Manual Bash mencatat bahwa:
Bentuk POSIX $() dari substitusi perintah diimplementasikan (lihat Substitusi Perintah), dan lebih disukai daripada " shell Bourne (yang juga diimplementasikan untuk kompatibilitas mundur).
Jadi $(...)
lebih disukai daripada `...`
dalam hal baru dan spesifik Bash yang Anda tulis¹. Substitusi backtick tidak bersarang dengan baik (Anda harus menghindarinya), dan memiliki beberapa perilaku mengutip yang sedikit aneh. Anda dapat membuat sarang $(... $(...) ...)
sewenang-wenang banyak tanpa masalah. Manual tersebut menjelaskan perilaku keduanya sebagai:
Ketika bentuk substitusi backquote gaya lama digunakan, garis miring terbalik mempertahankan arti literalnya kecuali jika diikuti oleh '$', ''`', atau ''. Kutipan balik pertama yang tidak didahului oleh garis miring terbalik mengakhiri substitusi perintah. Saat menggunakan formulir $(command), semua karakter di antara tanda kurung membentuk perintah; tidak ada yang diperlakukan secara khusus.
Biasanya dianggap sebagai praktik terbaik untuk mengutip semua perluasan string untuk menghindari masalah pemisahan kata, termasuk di tempat yang tidak benar-benar diperlukan, jadi "$(...)"
juga latihan yang lebih baik di sini.
Terakhir, dua bagian yang relevan dari halaman wooledge yang sama:
- Ini juga saatnya Anda melupakan
`...`
. Itu tidak konsisten dengan sintaks Ekspansi dan sangat sulit untuk bersarang tanpa dosis obat penghilang rasa sakit. Gunakan$(...)
sebagai gantinya.- Dan demi Tuhan, "Gunakan lebih banyak kutipan!" Lindungi string dan ekspansi parameter Anda dari pemisahan kata. Pemisahan kata akan memakan bayi Anda jika Anda tidak mengutip dengan benar.
Sebenarnya, bahkan dalam POSIX sh
skrip, ini dianggap sebagai praktik terbaik. Masih ada cangkang yang lebih lemah, tetapi Anda akan tahu jika Anda akan menghadapinya.