Saya mencoba mendapatkan parameter kutipan dari skrip bash agar dapat diterima dengan aman oleh skrip bersarang. Ada ide?
test.sh
#!/bin/bash
echo $*
bash myecho.sh $*
myecho.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
Sampel:
bash test.sh aaa bbb '"ccc ddd"'
Hasil:
aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"
Hasil yang diinginkan
aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
Jawaban:
Perhatikan bahwa konstruksi "$ @" tidak spesifik untuk bash dan harus bekerja dengan shell POSIX manapun (setidaknya dengan tanda hubung). Perhatikan juga bahwa mengingat keluaran yang Anda inginkan, Anda tidak memerlukan tingkat kutipan ekstra sama sekali. IE panggil saja skrip di atas seperti:
sumber
$@
tidak tersedia di dalam fungsi (karena ditimpa oleh argumen fungsi). Aku mencobafoovar="$@"
danfoovar=$@
+"$foovar"
dalam fungsi dan tidak bekerja: - /Anda ingin menggunakan "$ @" (kutipan dolar di) untuk meneruskan parameter ke subskrip. Seperti itu ....
ls-color.sh:
Mengapa .....
Dari halaman manual Bash :
Menyiapkan beberapa skrip demo ...
"$@"
- quote-dollar-at adalah transformasi identitas untuk meneruskan argumen ke subkulit (~ 99% dari waktu, inilah yang ingin Anda lakukan):"$*"
- quote-dollar-star menghancurkan args menjadi satu string (~ 1% dari waktu Anda benar-benar menginginkan perilaku ini, misalnya dalam kondisiif [[ -z "$*" ]]; then ...
:):$*
/$@
- tanpa tanda kutip, kedua bentuk menghapus satu tingkat kutipan dan menafsirkan spasi dari string yang mendasarinya tetapi mengabaikan karakter kutipan (hampir selalu, ini adalah kesalahan):Jika Anda ingin bersenang-senang, Anda dapat menggunakan "$ @" untuk mengumpulkan hal-hal sedalam yang Anda inginkan, mendorong dan mengeluarkan elemen dari tumpukan args jika Anda mau.
sumber