Jawaban:
Shell perintah dan argumen untuk perintah yang muncul sebagai bernomor variabel shell: $0
memiliki nilai string dari perintah itu sendiri, sesuatu seperti script
, ./script
, /home/user/bin/script
atau apa pun. Argumen muncul sebagai "$1"
, "$2"
, "$3"
dan sebagainya. Hitungan argumen ada dalam variabel shell "$#"
.
Cara umum menangani ini melibatkan perintah shell getopts
dan shift
. getopts
sangat mirip dengan getopt()
fungsi C library. shift
memindahkan nilai $2
ke $1
, $3
ke $2
, dan seterusnya; $#
akan dikurangi. Kode akhirnya melihat nilai "$1"
, melakukan sesuatu menggunakan case
... esac
untuk memutuskan suatu tindakan, dan kemudian melakukan shift
untuk pindah $1
ke argumen berikutnya. Hanya perlu memeriksa $1
, dan mungkin $#
.
Anda dapat mengakses argumen yang diteruskan dengan di $n
mana n
nomor argumen - 1, 2, 3, ...
. Anda memberikan argumen seperti yang Anda lakukan dengan perintah lain.
$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
$/shellscriptname.sh argument1 argument2 argument3
Anda juga dapat meneruskan output dari satu skrip shell sebagai argumen ke skrip shell lain.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
Dalam skrip shell Anda dapat mengakses argumen dengan angka seperti $1
untuk argumen pertama dan $2
untuk argumen kedua dan sebagainya.
Formulir
$ ./script.sh "$@"
adalah yang paling nyaman untuk argv
. Pembatas arg adalah spasi putih, tetapi dapat diubah. Tidak ingat bagaimana begitu saja. Kemudian gunakan
$1, $2, shift, if [ $# -ne 3 ]
untuk mengontrol aliran. Saya biasanya tidak merangkul getop jika case ... esac
cukup.
Pada skrip bash, saya pribadi suka menggunakan skrip berikut untuk mengatur parameter:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
Dengan struktur ini, kami tidak bergantung pada urutan parameter, karena kami mendefinisikan huruf utama untuk masing-masing parameter. Selain itu, fungsi bantuan akan dicetak setiap saat parameternya salah. Ini sangat berguna ketika kita memiliki banyak skrip dengan parameter yang berbeda untuk ditangani. Ini berfungsi sebagai berikut:
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
Dalam skrip shell; itu menjadi nama variabel $ 1. Kata kedua menjadi nama variabel $ 2 dan seterusnya.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
Lebih banyak ditemukan di manual shell (sh) di http://heirloom.sourceforge.net/sh/sh.1.html
Jika Anda terbiasa dengan Python argparse, dan tidak keberatan memanggil python untuk mem-parsing argumen bash, gunakan bash argparse ( https://github.com/mattbryson/bash-arg-parse ),
Lihat jawaban yang sama di sini: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null
------------------------------------------------------------------------
./scriptname.sh value1 value2
2> /dev/null
, 2) tidak menambahkan apa pun ke jawaban yang ada.
getopt()
adalah standar yang sangat mapan, tetapigetopt
executable tidak sama di seluruh distro / platform. Saya pengguna yang sekarang sepenuhnya dikonversigetopts
, karena ini adalah standar POSIX. Ini berfungsi dengan baikdash
juga, yang merupakan shell skrip pilihan saya