Berjuang sebentar melewati array sebagai argumen tapi tetap saja tidak berhasil. Saya sudah mencoba seperti di bawah ini:
#! /bin/bash
function copyFiles{
arr="$1"
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles $array
Jawaban dengan penjelasan akan menyenangkan.
Sunting: Pada dasarnya, saya akhirnya akan memanggil fungsi dari file skrip lain. Tolong jelaskan kendala jika memungkinkan.
copyFiles {…}
dancopyFiles(){…}
dancopyFiles() {…}
, tetapi tidakcopyFiles{…}
. Perhatikan ruang dalam varian tanpa()
Anda juga bisa meneruskan array sebagai referensi. yaitu:
tetapi perhatikan bahwa modifikasi apa pun untuk arr akan dilakukan ke array.
sumber
Jika Anda ingin meneruskan satu atau lebih argumen DAN sebuah array, saya usulkan perubahan ini ke skrip @AB
Array harus menjadi argumen terakhir dan hanya satu array yang dapat dilewati
Keluaran:
sumber
shift
penggunaannya.shift 6
.arr
. Apakah mungkin untuk memiliki parameter array di tengah? Atau bahkan beberapa parameter array?function copyAndMove() { msg1=$1 ; arr1=...?... ; msg2=? ; arr2=...?... ; msg3=? ; ... }
. Seperti saya akan mendefinisikannya dalam python:def copyAndMove(msg1="foo", cpFiles=[], msg2="bar", mvFiles=[], msg3="baz"): ...
. Sudahlah, saya menemukan stackoverflow.com/a/4017175/472245Ada beberapa masalah. Ini formulir kerjanya:
Harus ada setidaknya ruang antara deklarasi fungsi dan
{
Anda tidak dapat menggunakan
$array
, sepertiarray
array bukan variabel. Jika Anda ingin mendapatkan semua nilai penggunaan array"${array[@]}"
Dalam Anda utama deklarasi fungsi Anda perlu
arr="$@"
sebagai"${array[@]}"
akan memperluas dengan nilai-nilai diindeks dipisahkan oleh spasi, jika Anda menggunakan$1
Anda akan mendapatkan hanya nilai pertama. Untuk mendapatkan semua nilai, gunakanarr="$arr[@]}"
.sumber
arr=("$@")
break
bawah iniecho "$i"
. Dalam versi Anda, Anda masih akan melihat semua elemen. Namun, itu harus tiga baris.Berikut ini contoh yang sedikit lebih besar. Untuk penjelasan, lihat komentar dalam kode.
sumber
Cara terbaik adalah lulus sebagai argumen posisi. Tidak ada lagi. Anda dapat lulus sebagai string, tetapi cara ini dapat menyebabkan beberapa masalah. Contoh:
atau
keluaran:
Maksud Anda jika nilai array memiliki simbol spasi, Anda harus mengutip elemen terlebih dahulu sebelum lulus untuk mengakses nilai berdasarkan indeks dalam fungsi, gunakan $ 1 $ 2 $ 3 ... parameter posisi. Di mana indeks 0 -> 1, 1 -> 2, ... Untuk mengulangi akses yang terbaik adalah selalu menggunakan $ 1 dan setelah Shift. Tidak ada tambahan yang dibutuhkan. Anda dapat memberikan argumen tanpa array seperti ini:
bash media secara otomatis membuat larik dari argumen yang diteruskan yang meneruskannya agar berfungsi dan kemudian Anda memiliki argumen posisi. Selanjutnya ketika Anda menulis $ {array [2]} Anda benar-benar menulis argumen konsekuen satu dua tiga empat dan meneruskannya ke fungsi. Jadi, panggilan itu setara.
sumber
Seburuk itu, berikut adalah solusi yang berfungsi selama Anda tidak melewatkan array secara eksplisit, tetapi variabel yang sesuai dengan array:
Saya yakin seseorang dapat datang dengan implementasi ide yang lebih bersih, tetapi saya telah menemukan ini menjadi solusi yang lebih baik daripada melewati array
"{array[@]"}
dan kemudian mengaksesnya menggunakan internalarray_inside=("$@")
. Ini menjadi rumit ketika ada posisi /getopts
parameter lain. Dalam kasus ini, saya harus terlebih dahulu menentukan dan kemudian menghapus parameter yang tidak terkait dengan array menggunakan beberapa kombinasishift
dan penghapusan elemen array.Perspektif yang murni cenderung memandang pendekatan ini sebagai pelanggaran bahasa, tetapi secara pragmatis, pendekatan ini telah menyelamatkan saya dari banyak kesedihan. Pada topik terkait, saya juga menggunakan
eval
untuk menetapkan array yang dibangun secara internal ke variabel bernama sesuai dengan parameter yangtarget_varname
saya berikan ke fungsi:sumber
array_internally
sebuah alias itu:declare -n array_internally=$1
. Dan sisanya tentang "menjadi rumit" dan "menentukan dan kemudian menghapus ..." berlaku untuk terlepas dari bagaimana Anda melewati array, jadi saya tidak melihat apa gunanya itu. Daneval
array yang berpotensi mengandung karakter khusus hanya menunggu kesedihan terjadi di kemudian hari.