Saya ingin skrip Bash saya untuk mencetak pesan kesalahan jika jumlah argumen yang diperlukan tidak terpenuhi.
Saya mencoba kode berikut:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
Untuk beberapa alasan yang tidak diketahui, saya mengalami kesalahan berikut:
test: line 4: [2: command not found
Apa yang saya lakukan salah?
test
. Itulah nama perintah Unix standar, Anda tidak ingin membayangi itu.test
baik-baik saja asalkan tidak ada di PATH?Jawaban:
Sama seperti perintah sederhana lainnya,
[ ... ]
atautest
membutuhkan spasi di antara argumennya.Atau
Saran
Ketika di Bash, lebih suka menggunakan
[[ ]]
karena tidak melakukan pemisahan kata dan perluasan pathname ke variabel-variabelnya yang mengutip mungkin tidak diperlukan kecuali itu bagian dari ekspresi.Ini juga memiliki beberapa fitur lain seperti pengelompokan kondisi tanpa tanda kutip, pencocokan pola (pencocokan pola diperluas dengan
extglob
) dan pencocokan regex.Contoh berikut memeriksa apakah argumen valid. Ini memungkinkan satu atau dua argumen.
Untuk ekspresi aritmatika murni, menggunakan
(( ))
beberapa mungkin masih lebih baik, tetapi mereka masih mungkin dalam[[ ]]
dengan operator aritmatika yang suka-eq
,-ne
,-lt
,-le
,-gt
, atau-ge
dengan menempatkan ekspresi sebagai argumen string tunggal:Itu seharusnya membantu jika Anda perlu menggabungkannya dengan fitur-fitur lain
[[ ]]
juga.Keluar dari skrip
Ini juga logis untuk membuat skrip keluar ketika parameter yang tidak valid diteruskan ke sana. Ini telah disarankan dalam komentar oleh ekangas tetapi seseorang mengedit jawaban ini untuk menjadikannya
-1
sebagai nilai yang dikembalikan, jadi saya mungkin melakukannya dengan benar.-1
meskipun diterima oleh Bash sebagai argumen untukexit
tidak didokumentasikan secara eksplisit dan tidak benar untuk digunakan sebagai saran umum.64
juga merupakan nilai paling formal karena sudah didefinisikansysexits.h
dengan#define EX_USAGE 64 /* command line usage error */
. Sebagian besar alat sukals
juga mengembalikan2
argumen yang tidak valid. Saya juga biasa mengembalikan2
skrip saya tetapi belakangan ini saya tidak lagi peduli, dan hanya digunakan1
dalam semua kesalahan. Tapi mari kita letakkan di2
sini karena ini paling umum dan mungkin tidak spesifik untuk OS.Referensi
sumber
[
itu hanyalah perintah lain, yaitu, cobalahwhich [
.[
adalah builtin, sedangkan[[
kata kunci. Dalam beberapa kerang yang lebih tua,[
bahkan tidak builtin. Perintah seperti[
secara alami ada bersama sebagai perintah eksternal di sebagian besar sistem, tetapi perintah internal diprioritaskan oleh shell kecuali jika Anda memotong dengancommand
atauexec
. Periksa dokumentasi shell tentang bagaimana mereka mengevaluasi. Perhatikan perbedaan mereka, dan bagaimana mereka dapat berperilaku berbeda di setiap shell.Ini mungkin ide yang baik untuk menggunakan ekspresi aritmatika jika Anda berurusan dengan angka.
sumber
[ ... ]
, ketika hal ini berhasil dengan baik dan tidak diperlukan operasi mewah?$(( ))
tidak mewah dan harus diimplementasikan oleh semua shell POSIX. Namun,(( ))
sintaks (tanpa$
) bukan bagian dari itu. Jika Anda karena alasan tertentu terbatas, maka tentunya Anda dapat menggunakannya[ ]
sebagai gantinya, tetapi perlu diingat bahwa Anda tidak boleh menggunakannya[[ ]]
juga. Saya harap Anda memahami perangkap[ ]
dan alasan mengapa fitur ini ada. Tapi ini adalah pertanyaan Bash jadi kami memberikan jawaban Bash ( "Sebagai aturan praktis, [[digunakan untuk string dan file. Jika Anda ingin membandingkan angka, gunakan ArithmeticExpression" ).Pada []:! =, =, == ... adalah operator perbandingan string dan -eq, -gt ... adalah aritmatika biner .
Saya akan menggunakan:
Atau:
sumber
==
sebenarnya adalah fitur tidak berdokumen, yang kebetulan berfungsi dengan GNUtest
. Ini juga terjadi untuk bekerja dengan FreeBSDtest
, tetapi mungkin tidak berfungsi pada footest
. Satu- satunya perbandingan standar adalah=
(hanya FYI).dash
:dash -c '[ 1 == 1 ]'
. POSIX hanya menentukan=
, dan tidak==
.Jika Anda hanya tertarik untuk membayar jika argumen tertentu tidak ada, Substitusi Parameter bagus:
sumber
Satu liner sederhana yang berfungsi dapat dilakukan menggunakan:
Ini dipecah menjadi:
Berpikir untuk diperhatikan:
sumber
exit 1
hanya akan berlaku untuk konteks subkulit membuatnya hanya identik dengan( usage; false )
. Saya bukan penggemar penyederhanaan seperti itu ketika datang ke opsi-parsing, tetapi Anda dapat menggunakannya{ usage && exit 1; }
sebagai gantinya. Atau mungkin saja{ usage; exit 1; }
.{...}
adalah sintaksis umum dan tersedia untuk sebagian besar jika tidak semua shell berdasarkansh
, bahkan shell yang lebih tua tidak mengikuti standar POSIX.Lihat ini pesta cheatsheet, dapat membantu banyak.
Untuk memeriksa panjang argumen yang diteruskan, Anda gunakan
"$#"
Untuk menggunakan array argumen yang diteruskan, Anda menggunakan
"$@"
Contoh memeriksa panjang, dan iterasi adalah:
Articled ini membantu saya, tetapi kehilangan beberapa hal untuk saya dan situasi saya. Semoga ini bisa membantu seseorang.
sumber
Jika Anda ingin berada di sisi yang aman, saya sarankan untuk menggunakan getopts.
Ini adalah contoh kecil:
lihat lebih detail di sini misalnya http://wiki.bash-hackers.org/howto/getopts_tutorial
sumber
Di sini sederhana satu liner untuk memeriksa apakah hanya satu parameter yang diberikan jika tidak keluar dari skrip:
sumber
Anda harus menambahkan spasi di antara kondisi pengujian:
Saya harap ini membantu.
sumber