Saya bingung dengan penggunaan tanda kurung, kurung, kurung kurawal di Bash, serta perbedaan antara bentuk ganda atau tunggal. Apakah ada penjelasan yang jelas?
Di Bash, test
dan [
shell builtins.
The bracket ganda , yang merupakan kata kunci shell, memungkinkan fungsionalitas tambahan. Misalnya, Anda dapat menggunakan &&
dan ||
bukannya -a
dan -o
dan ada operator pencocokan ekspresi reguler =~
.
Juga, dalam tes sederhana, kurung kotak ganda tampaknya mengevaluasi cukup banyak lebih cepat daripada yang tunggal.
$ time for ((i=0; i<10000000; i++)); do [[ "$i" = 1000 ]]; done
real 0m24.548s
user 0m24.337s
sys 0m0.036s
$ time for ((i=0; i<10000000; i++)); do [ "$i" = 1000 ]; done
real 0m33.478s
user 0m33.478s
sys 0m0.000s
Kawat gigi, selain membatasi nama variabel digunakan untuk ekspansi parameter sehingga Anda dapat melakukan hal-hal seperti:
Potong isi suatu variabel
$ var="abcde"; echo ${var%d*}
abc
Buat penggantinya mirip dengan sed
$ var="abcde"; echo ${var/de/12}
abc12
Gunakan nilai default
$ default="hello"; unset var; echo ${var:-$default}
hello
dan beberapa lainnya
Juga, ekspansi brace membuat daftar string yang biasanya diulang dalam loop:
$ echo f{oo,ee,a}d
food feed fad
$ mv error.log{,.OLD}
(error.log is renamed to error.log.OLD because the brace expression
expands to "mv error.log error.log.OLD")
$ for num in {000..2}; do echo "$num"; done
000
001
002
$ echo {00..8..2}
00 02 04 06 08
$ echo {D..T..4}
D H L P T
Perhatikan bahwa fitur zero and increment terdepan tidak tersedia sebelum Bash 4.
Terima kasih kepada gboffi untuk mengingatkan saya tentang ekspansi brace.
Tanda kurung ganda digunakan untuk operasi aritmatika :
((a++))
((meaning = 42))
for ((i=0; i<10; i++))
echo $((a + b + (14 * c)))
dan mereka memungkinkan Anda untuk menghilangkan tanda dolar pada variabel integer dan array dan menyertakan spasi di sekitar operator agar mudah dibaca.
Kurung tunggal juga digunakan untuk indeks array :
array[4]="hello"
element=${array[index]}
Curly brace diperlukan untuk referensi array (sebagian besar / semua?) Di sebelah kanan.
komentar ephemient mengingatkan saya bahwa tanda kurung juga digunakan untuk subkulit. Dan mereka digunakan untuk membuat array.
array=(1 2 3)
echo ${array[1]}
2
:
.$[expression]
; ini adalah sintaks ekspresi aritmatika lama, usang untuk sintaks yang lebih baru, lebih disukai:$((expression))
bash
adalah menciptakan urutan, seperti yang disebutkan di bawah ini ( stackoverflow.com/a/8552128/2749397 ) Karena saya ingin sedikit mengomentari fitur ini (karena Anda tidak menyebutkannya ;-) Saya ' m mengambil kebebasan menggunakan jawaban yang paling banyak dipilih sebagai kendaraan ... Dua contoh urutan literal:echo {01..12}
->01 02 03 04 05 06 07 08 09 10 11 12
(perhatikan nol awal);echo {C..Q}
->C D E F G H I J K L M N O P Q
. Penggunaan utamanya adalah dalam loop, misalnya,for cnt in {01..12} ; do ... ${cnt} ... ; done
echo {01..12..2}
-> "01 03 05 07 09 11". Terima kasih atas pengingat tentang urutan. Saya akan menambahkannya ke jawaban saya.Braket tunggal (
[
) biasanya sebenarnya memanggil program bernama[
;man test
atauman [
untuk info lebih lanjut. Contoh:Braket ganda (
[[
) melakukan hal yang sama (pada dasarnya) sebagai braket tunggal, tetapi merupakan bash bawaan.Tanda kurung (
()
) digunakan untuk membuat subkulit. Sebagai contoh:Seperti yang Anda lihat, subkulit memungkinkan Anda untuk melakukan operasi tanpa mempengaruhi lingkungan shell saat ini.
(a) Kawat gigi (
{}
) digunakan untuk mengidentifikasi variabel secara jelas. Contoh:(B) Kawat gigi juga digunakan untuk mengeksekusi urutan perintah dalam konteks shell saat ini , misalnya
Ada perbedaan sintaksis yang halus dengan
( )
, (lihat referensi bash ); pada dasarnya, tanda titik koma;
setelah perintah terakhir dalam kawat gigi adalah suatu keharusan, dan kawat gigi{
,}
harus dikelilingi oleh spasi.sumber
[
sebenarnya builtin di Bash, tetapi seharusnya bertindak seperti/bin/[
berlawanan dengan[[
builtin.[[
memiliki fitur yang berbeda, seperti operasi yang lebih logis dan peran kutipan yang berbeda. Selain itu: tanda kurung tunggal juga digunakan untuk array, substitusi proses, dan glob diperpanjang; tanda kurung ganda digunakan untuk aritmatika; kurung kurawal{}
digunakan untuk pengelompokan perintah atau banyak jenis ekspansi parameter atau ekspansi kurung atau ekspansi urutan. Saya yakin saya telah melewatkan beberapa kegunaan lain juga ...if [ $VARIABLE == abcdef ]
adalah bashism yang - meskipun berfungsi - mungkin harus dihindari; baik menggunakan bash (if [[ ...==...]]
) secara eksplisit atau memperjelas bahwa Anda menggunakan conditional (if [ "$VARIABLE" = "abcdef" ]
) yang lebih tradisional . Dapat diperdebatkan, skrip harus dimulai sesederhana dan semudah mungkin, hingga benar-benar membutuhkan fitur khusus untuk bash (karena satu dan lain hal). Tetapi bagaimanapun juga, tujuannya harus jelas; "=" dan "==" dan "[[" dan "[" berfungsi secara berbeda dan penggunaannya harus konsisten.[ "$var" = ".."]
alih-alih==
, sedangkan di C akan menetapkan bukan pengujian (dan merupakan penyebab bug yang cukup umum) ... mengapa tidak bisatest
digunakan==
bukan=
? ada yang tahu?/usr/bin/[
bukan symlink ke/usr/bin/test
, dan banyak lagi: program-program ini bahkan memiliki beberapa ukuran yang berbeda!)
adalah bagian daricase
sintaks pernyataan untuk mengakhiri garis kasus. Itu tidak memiliki tanda kurung buka. Ini melempar saya dari pertama kali saya melihatnya.Kurung
[1] http://wiki.bash-hackers.org/scripting/obsolete
Kurung kurawal
Tanda kurung
Tanda kurung ganda
sumber
$(varname)
tidak terkait dengan sintaks bash. Itu adalah bagian dari sintaks Makefile .$(varname)
tidak ada hubungannya dengan sintaks bash dalam kasus Anda.Saya hanya ingin menambahkan ini dari TLDP :
sumber
echo ${#ARRAY}
menampilkan tiga, karena elemen pertamaARRAY
berisi tiga karakter, bukan karena mengandung tiga elemen! Untuk mencetak jumlah elemen yang digunakanecho ${#ARRAY[@]}
.${TEST:-test}
sama dengan$TEST
jika variabelTEST
ada, jika tidak, ia hanya mengembalikan string "test". Ada versi lain yang bahkan lebih:${TEST:=test}
--- yang juga sama dengan$TEST
jika TEST ada, tetapi setiap kali tidak ada, itu menciptakan variabelTEST
dan memberikan nilai "tes" dan juga menjadi nilai dari keseluruhan ekspresi.Perbedaan antara tes , [ dan [[ dijelaskan dengan sangat rinci di BashFAQ .
Dan kesimpulannya:
sumber
Kurung dalam definisi fungsi
Tanda kurung
()
sedang digunakan dalam definisi fungsi:Itulah alasan Anda harus keluar dari tanda kurung bahkan dalam parameter perintah:
sumber
unset -f echo
. Lihathelp unset
.sumber