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?

Paul
sumber

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

Bruce Ediger
sumber
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
Kevin
sumber
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

Balaswamy vaddeman
sumber
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.

pengguna400344
sumber
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
Rafael Muynarsk
sumber
13
./myscript myargument

myargumentmenjadi $1di dalam myscript.

vimdude
sumber
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

FireInTheSky
sumber
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
Yogesh
sumber
3
1) tidak perlu 2> /dev/null, 2) tidak menambahkan apa pun ke jawaban yang ada.
xenoid