Dalam contoh khusus ini, tidak ada bedanya. Namun, {}
in ${}
berguna jika Anda ingin memperluas variabel foo
dalam string
"${foo}bar"
karena "$foobar"
sebaliknya akan memperluas variabel yang diidentifikasi oleh foobar
.
Kurung kurawal juga dibutuhkan tanpa syarat saat:
- memperluas elemen array, seperti pada
${array[42]}
- menggunakan operasi ekspansi parameter, seperti pada
${filename%.*}
(hapus ekstensi)
- memperluas parameter posisi di luar 9:
"$8 $9 ${10} ${11}"
Melakukan hal ini di mana-mana, alih-alih hanya dalam kasus-kasus yang berpotensi ambigu, dapat dianggap sebagai praktik pemrograman yang baik. Ini untuk konsistensi dan untuk menghindari kejutan seperti $foo_$bar.jpg
, di mana tidak jelas secara visual bahwa garis bawah menjadi bagian dari nama variabel.
{}
dikenal sebagai ekspansi brace .${}
dikenal sebagai ekspansi variabel. Mereka melakukan hal yang berbeda. Saya akan mendukung Anda kecuali sedikit ekspansi.$()
digunakan untuk mengeksekusi perintah, sehinggamd5sum=$(md5sum foo.bin)
akan menyimpan outputmd5sum foo.bin
dalam variabelmd5sum
, yang sekarang dapat diakses menggunakan${md5sum}
. +1, dan masih banyak lagi dalam semangat untuk OP karena menyebutkan bahwa itu praktik yang baik untuk menjadi eksplisit!$()
mengeksekusi perintahnya dari sebuah subkulit .${1:-20}
adalah bentuk ekspansi parameter. Di sini tidak jelas karena ini terutama menggunakan digit dan operator aritmatika yang menipu kita dalam berpikir ada aritmatika yang terlibat, tetapi sebenarnya mengacu pada parameter posisi$1
, yang jika tidak didefinisikan akan diganti oleh nilai default20
(sintaksnya adalah${variable:-default_value}
).Variabel dideklarasikan dan ditugaskan tanpa
$
dan tanpa{}
. Anda harus menggunakanuntuk menetapkan. Untuk membaca dari variabel (dengan kata lain, 'perluas' variabel), Anda harus menggunakan
$
.Ini kadang membuat saya bingung - dalam bahasa lain kami merujuk variabel dengan cara yang sama, terlepas dari apakah itu di sebelah kiri atau kanan tugas. Tetapi shell-scripting berbeda,
$var=10
tidak melakukan apa yang Anda pikirkan!sumber
Anda gunakan
{}
untuk pengelompokan. Kawat gigi diperlukan untuk elemen array dereference. Contoh:sumber
dir=(*)
. Sejauh yang saya tahu,dir
adalah perintah bawaan untuk membuat daftar isi direktori (setara denganls -C -b
). Bisakah Anda jelaskan?dir
adalah nama variabel, dan tanda kurung digunakan untuk mengumpulkan ekspansi nama file*
ke dalam array.Anda juga dapat melakukan beberapa manipulasi teks di dalam kurung:
Hasil:
atau
Hasil:
Anda benar dalam "variabel biasa" tidak diperlukan ... Tetapi lebih bermanfaat untuk debugging dan membaca skrip.
sumber
Akhir nama variabel biasanya ditandai oleh spasi atau baris baru. Tetapi bagaimana jika kita tidak menginginkan spasi atau baris baru setelah mencetak nilai variabel? Kurung kurawal memberi tahu penerjemah shell di mana akhir nama variabel.
Contoh Klasik 1) - variabel shell tanpa tertinggal spasi
Contoh 2) Java classpath dengan toples berversi
(Jawaban Fred sudah menyatakan ini tetapi contohnya agak terlalu abstrak)
sumber
Kurung kurawal selalu dibutuhkan untuk mengakses elemen larik dan melakukan ekspansi penjepit.
Adalah baik untuk tidak terlalu berhati-hati dan menggunakan
{}
ekspansi variabel shell bahkan ketika tidak ada ruang untuk ambiguitas.Sebagai contoh:
Jadi, lebih baik menulis tiga baris sebagai:
yang pasti lebih mudah dibaca.
Karena nama variabel tidak dapat dimulai dengan digit, shell tidak perlu di
{}
sekitar variabel bernomor (seperti$1
,$2
dll.) Kecuali ekspansi tersebut diikuti oleh digit. Itu terlalu halus dan tidak digunakan secara eksplisit{}
dalam konteks seperti itu:Lihat:
sumber
It's good to be not over-cautious
: Saya ingin tahu apa yang dipikirkan kebanyakan orang. Gunakan kurung kurawal sepanjang waktu sehingga Anda tidak melupakannya saat dibutuhkan, atau menggunakannya hanya jika diperlukan, untuk meningkatkan keterbacaan.Mengikuti saran SierraX dan Peter tentang manipulasi teks, kurung keriting
{}
digunakan untuk meneruskan variabel ke perintah, misalnya:Katakanlah Anda memiliki file sposi.txt yang berisi baris pertama novel terkenal Italia:
Ouput:
quel ramo del lago di como che volge a mezzogiorno
Sekarang buat dua variabel:
Sekarang gantikan konten variabel kata dengan yang ada di new_word , di dalam file sposi.txt
Ouput:
quel filone del lago di como che volge a mezzogiorno
Kata "ramo" telah diganti.
sumber
weel-known novel
sedikit. Namun demikian, tervotasikan.