Jawaban:
Shell perintah dan argumen untuk perintah yang muncul sebagai bernomor variabel shell: $0memiliki nilai string dari perintah itu sendiri, sesuatu seperti script, ./script, /home/user/bin/scriptatau apa pun. Argumen muncul sebagai "$1", "$2", "$3"dan sebagainya. Hitungan argumen ada dalam variabel shell "$#".
Cara umum menangani ini melibatkan perintah shell getoptsdan shift. getoptssangat mirip dengan getopt()fungsi C library. shiftmemindahkan nilai $2ke $1, $3ke $2, dan seterusnya; $#akan dikurangi. Kode akhirnya melihat nilai "$1", melakukan sesuatu menggunakan case... esacuntuk memutuskan suatu tindakan, dan kemudian melakukan shiftuntuk pindah $1ke argumen berikutnya. Hanya perlu memeriksa $1, dan mungkin $#.
Anda dapat mengakses argumen yang diteruskan dengan di $nmana nnomor 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 $1untuk argumen pertama dan $2untuk 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 ... esaccukup.
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, tetapigetoptexecutable tidak sama di seluruh distro / platform. Saya pengguna yang sekarang sepenuhnya dikonversigetopts, karena ini adalah standar POSIX. Ini berfungsi dengan baikdashjuga, yang merupakan shell skrip pilihan saya