Saya perlu memeriksa keberadaan argumen input. Saya memiliki skrip berikut
if [ "$1" -gt "-1" ]
then echo hi
fi
saya mendapat
[: : integer expression expected
Bagaimana cara memeriksa input argumen1 terlebih dahulu untuk melihat apakah ada?
[ -z "$1" ] && echo "No argument supplied"
Saya lebih suka satu kalimat, karena lebih mudah bagi saya; dan itu juga lebih cepat untuk memeriksa nilai keluar, dibandingkan dengan menggunakanif
exit 1
di akhir gema Anda di dalam blok if ketika argumen diperlukan agar skrip berfungsi. Jelas, tetapi perlu diperhatikan untuk kelengkapannya.programname "" secondarg third
. The$#
cek jelas memeriksa jumlah argumen.if [ ! -z "$1" ]; then ...
Lebih baik menunjukkan cara ini
Anda biasanya perlu keluar jika Anda memiliki terlalu sedikit argumen.
sumber
exit 1
yang biasanya Anda inginkan, dan menggunakan[[ ]]
tes yang (iirc) biasanya lebih masuk akal. Jadi untuk orang-orang yang secara buta menyalin kode tempel ini adalah jawaban yang lebih baik.Dalam beberapa kasus, Anda perlu memeriksa apakah pengguna meneruskan argumen ke skrip dan jika tidak, kembali ke nilai default. Seperti pada skrip di bawah ini:
Di sini jika pengguna belum lulus
scale
sebagai parameter ke-2, saya meluncurkan emulator Android-scale 1
secara default.${varname:-word}
adalah operator ekspansi. Ada juga operator ekspansi lainnya:${varname:=word}
yang menetapkan undefinedvarname
bukannya mengembalikanword
nilai;${varname:?message}
yang akan kembalivarname
jika sudah ditentukan dan bukan nol atau mencetakmessage
dan membatalkan skrip (seperti contoh pertama);${varname:+word}
yang mengembalikanword
hanya jikavarname
didefinisikan dan bukan nol; mengembalikan nol sebaliknya.sumber
${varname?message}
. Apakah tambahan:
kesalahan ketik, atau apakah itu mengubah perilaku?: ${1?"First argument is null"} ${2?"Please provide more than 1 argument"}
Mencoba:
sumber
$#
dan0
?else
, juga.foo*
) dan pemisahan kata (yaitu membelah konten jika nilainya mengandung spasi). Dalam hal ini tidak perlu mengutip$#
karena kedua kasus tersebut tidak berlaku. Mengutip0
juga tidak perlu, tetapi beberapa orang lebih suka mengutip nilai karena mereka benar-benar string dan yang membuatnya lebih eksplisit.Cara lain untuk mendeteksi jika argumen dilewatkan ke skrip:
Catatan yang
(( expr ))
menyebabkan ekspresi dievaluasi sesuai aturan Aritmatika Shell .Untuk keluar tanpa adanya argumen, orang dapat mengatakan:
Cara (analog) lain untuk mengatakan hal di atas adalah:
help let
mengatakan:sumber
exit
yang membunuh proses zsh saya, saya menggunakanreturn
yang tidak membunuhnya((!$#))
memicu substitusi sejarah?Saya sering menggunakan potongan ini untuk skrip sederhana:
sumber
Hanya karena ada lebih banyak titik dasar untuk ditunjukkan, saya akan menambahkan bahwa Anda dapat menguji string Anda adalah nol:
Demikian juga jika Anda mengharapkan penghitungan arg hanya menguji terakhir Anda:
dan seterusnya dengan arg atau var apa saja
sumber
Jika Anda ingin memeriksa apakah argumen tersebut ada, Anda dapat memeriksa apakah # argumen lebih besar atau sama dengan jumlah argumen target Anda.
Script berikut menunjukkan cara kerjanya
test.sh
menghasilkan output berikut
sumber
Sebagai pengingat kecil, operator tes numerik di Bash hanya bekerja pada bilangan bulat (
-eq
,-lt
,-ge
, dll)Saya ingin memastikan $ vars saya masuk
sebelum saya mengujinya, hanya untuk membela terhadap kesalahan "[: integer arg required".
sumber
var=$(printf "%.0f" "$var")
dapat menangani float tetapi menderita keluar non-nol saat diberi string. Jika Anda tidak keberatan awk, metode ini saya gunakan tampaknya menjadi yang paling kuat untuk menegakkan integer:var=$(<<<"$var" awk '{printf "%.0f", $0}')
. Jika var tidak disetel, defaultnya adalah "0". Jika var adalah float, itu dibulatkan ke bilangan bulat terdekat. Nilai negatif juga baik untuk digunakan.validasi fungsi satu liner bash
tambahkan nama fungsi dan penggunaan
tambahkan validasi untuk memeriksa apakah bilangan bulat
untuk menambahkan validasi tambahan, misalnya untuk memeriksa untuk melihat apakah argumen yang disahkan adalah bilangan bulat, modifikasi validasi satu liner untuk memanggil fungsi validasi:
kemudian, buat fungsi validasi yang memvalidasi argumen, mengembalikan 0 pada keberhasilan, 1 pada kegagalan dan fungsi mati yang membatalkan skrip pada kegagalan
Lebih sederhana - cukup gunakan
set -u
set -u
memastikan bahwa setiap variabel yang direferensikan diatur saat digunakan, jadi atur dan lupakan sajasumber