Saya mencoba untuk mengeksekusi kode di bawah ini tetapi ketika saya mencoba untuk menggunakan fungsi saya di pernyataan if saya mendapatkan -bash: [: too many arguments
kesalahan. Mengapa ini terjadi?
Terima kasih sebelumnya!
notContainsElement () {
local e match="$1"
shift
for e; do [[ "$e" == "$match" ]] && return 1; done
return 0
}
list=( "pears" "apples" "bananas" "oranges" )
blacklist=( "oranges" "apples" )
docheck=1
for fruit in "${list[@]}"
do
if [ notContainsElement "$fruit" "${blacklist[@]}" -a $docheck = 1 ]
then
echo $fruit
fi
done
Jawaban:
Saat menggunakan
if [ ... ]
Anda sebenarnya menggunakan[
utilitas (yang sama dengantest
tetapi mengharuskan argumen terakhir]
).[
tidak mengerti untuk menjalankan fungsi Anda, ia mengharapkan string. Untungnya, Anda tidak perlu menggunakan[
sama sekali di sini (setidaknya untuk fungsi):Perhatikan bahwa saya juga memeriksa integer terlebih dahulu, sehingga kita dapat menghindari memanggil fungsi sama sekali jika
$docheck
bukan 1.Ini berfungsi karena
if
mengambil perintah sewenang-wenang dan memutuskan apa yang harus dilakukan dari status keluar dari perintah itu. Di sini kami menggunakan[ ... ]
tes bersama dengan panggilan ke fungsi Anda, dengan&&
di antaranya, membuat perintah majemuk. Status keluar perintah majemuk akan benar jika[ ... ]
tes dan fungsi mengembalikan nol sebagai status keluarnya, menandakan keberhasilan.Sebagai catatan gaya, saya tidak akan memiliki tes fungsi apakah array tidak mengandung elemen tetapi apakah jika memang mengandung elemen, dan kemudian
Memiliki tes fungsi akan mengacaukan negatif up logika dalam kasus di mana Anda lakukan ingin menguji apakah array berisi elemen (
if ! notContainsElement ...
).sumber
mencoba
-a
opsi bukanlah shell atautest
opsidi sini Anda memiliki dua bagian tes
Anda menautkan kemudian
if
menggunakanseperti yang ditunjukkan
-a
adalah opsi tes, tetapi hanya dapat digunakan dengan opsi tes lainnya, sehingga Anda dapat menggunakannyauntuk menguji yang
$a
lebih rendah dari keduanya$b
dan$c
, tetapi Anda tidak dapat menggunakan perintah lain dalam cakupan pengujian.sumber
-a
adalah opsi tes , artinya AND.$docheck
, kuotasi$a
/$b
/ etc dalam contoh terakhir).Berikut adalah alternatif yang mungkin tidak disukai sebagian orang. Konversikan daftar hitam Anda menjadi string, dan lihat apakah string dengan buah yang dihapus sama. Diedit untuk membuat string dengan spasi. Terima kasih kepada Scott karena telah menunjukkan masalah apel / nanas.
Saya pikir ini lebih sederhana, tetapi tidak memiliki logika && yang disukai banyak orang.
sumber
list
buah terkandung dalam salah satublacklist
buah. Sebagai contoh, jika kita mengubahblacklist
ke( "oranges" "pineapples" )
, output dari script Anda tidak berubah. … (Lanjutan)&&
? (3) Ketika Anda memposting kode, silakan indentasi dengan tepat.two words
, dan dua item berikutnya,two
danwords
. Dan jika daftar Anda berisi*
entri, itu akan cocok dengan segalanya. (Dan karena Anda tidak mengutip$f
dalam apa yang harusecho "$f"
, jika Anda tidak mencoba untuk menggemakan elemen seperti itu, itu akan diganti dengan daftar nama file dalam direktori saat ini).