Bagaimana saya bisa meneruskan argumen baris perintah ke skrip shell?


243

Saya tahu bahwa skrip shell hanya menjalankan perintah seolah-olah dieksekusi di command prompt. Saya ingin dapat menjalankan skrip shell seolah-olah mereka adalah fungsi ... Artinya, mengambil nilai input atau string ke dalam skrip. Bagaimana saya melakukan pendekatan ini?

Jawaban:


199

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 $#.


6
C getopt()adalah standar yang sangat mapan, tetapi getoptexecutable tidak sama di seluruh distro / platform. Saya pengguna yang sekarang sepenuhnya dikonversi getopts, karena ini adalah standar POSIX. Ini berfungsi dengan baik dashjuga, yang merupakan shell skrip pilihan saya
— JM Becker

165

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

27
$/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.

Lebih lanjut tentang argumen shell


18

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.


14

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

13
./myscript myargument

myargumentmenjadi $1di dalam myscript.


5

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


2
selamat datang di U&L, ini hampir tidak menambah apa pun untuk jawaban yang sudah diberikan.
— Archemar


0
#!/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

3
1) tidak perlu 2> /dev/null, 2) tidak menambahkan apa pun ke jawaban yang ada.
— xenoid
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.