Bagaimana cara mengubah argumen baris perintah menjadi larik skrip bash?
Saya ingin mengambil ini:
./something.sh arg1 arg2 arg3
dan mengubahnya menjadi
myArray=( arg1 arg2 arg3 )
sehingga saya bisa menggunakan myArray untuk digunakan lebih lanjut dalam skrip.
Posting SO sebelumnya ini hampir selesai, tetapi tidak membahas cara membuat array: Bagaimana cara mengurai argumen baris perintah di Bash?
Saya perlu mengubah argumen menjadi array skrip bash biasa; Saya menyadari bahwa saya dapat menggunakan bahasa lain (Python, misalnya) tetapi perlu melakukan ini di bash. Saya kira saya sedang mencari fungsi "tambahkan" atau yang serupa?
UPDATE: Saya juga ingin bertanya bagaimana memeriksa nol argumen dan menetapkan nilai array default, dan terima kasih atas jawaban di bawah ini, dapat membuat ini berfungsi:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
set
memungkinkan Anda untuk mengatur parameter posisi untuk ruang lingkup. Ini juga memungkinkan Anda mengatur opsi shell. Anda dapat melakukannyaset foo
, yang berarti$1
memperluas ke "foo", tetapi jika parameter Anda mulai dengan tanda hubungset
akan menganggap Anda bermaksud mengatur opsi shell. Tanda hubung ganda memastikan bahwa semua parameter berikut diinterpretasikan sebagai parameter posisi yang akan ditetapkan.echo $@
akan mencetak semua argumen, tetapiecho $myArray
hanya akan mencetak elemen pertama. Untuk melihat semuanya, gunakanecho ${myArray[@]}
."${myArray[@]}"
. Jika Anda ingin mengulang-ulang array, Anda perlu tanda kutip untuk menghindari pemisahan elemen individual pada IFSMungkin ini bisa membantu:
Anda juga dapat mengulangi argumen dengan menghilangkan 'in':
akan setara
sumber
arg
bidang - apakah itu variabel yang telah ditentukan?${var}
diperluas ke kontenvar
.${var[n]}
diperluas ke konten elemenn
arrayvar
. Apakah${var[@]}
kemudian memperluas seluruh array, yaitu${var[0]} ${var[1]} ... ${var[n]}
(dengann
menjadi indeks elemen terakhir)?Sebenarnya daftar parameter dapat diakses dengan
$1 $2 ...
dll.Yang persis sama dengan:
Jadi, daftar parameter dapat diubah dengan set,
dan
${!i}
merupakan cara yang benar untuk mengaksesnya:Untuk kasus spesifik Anda, ini dapat digunakan (tanpa perlu array), untuk mengatur daftar argumen ketika tidak ada yang diberikan:
yang diterjemahkan ke ungkapan yang lebih sederhana ini:
sumber
echo "$#" "$i+1" "${!i}";
untuk mendapatkan output persis seperti yang ditunjukkan?Ini adalah penggunaan lain:
sumber
Lebih mudah lagi, Anda dapat beroperasi secara langsung
$@
;)Inilah cara melakukan pass daftar args langsung dari prompt:
sumber
for stuff in "$@" ; do ...
sama sepertifor stuff ; do ...
:)Tampilan berdampingan tentang bagaimana array dan $ @ praktis sama.
Kode:
Memasukkan:
Keluaran:
sumber
Pentingnya kutipan ganda patut ditekankan. Misalkan argumen berisi spasi putih.
Kode:
Keluaran:
sumber