Bir komut satırı argümanını bir kabuk betiğine nasıl aktarabilirim?


242

Kabuk komut dosyalarının komut isteminde çalıştırılıyormuş gibi komut çalıştırdığını biliyorum. Kabuk komut dosyalarını fonksiyonlarmış gibi çalıştırabilmeyi isterdim ... Yani, komut dosyasına bir girdi değeri veya dizge alarak. Bunu yaparken nasıl yaklaşırım?

Yanıtlar:


198

Kabuk komut ve bu komuta herhangi argümanlar olarak görünür numaralı kabuk değişkenleri: $0gibi bir şey komutunun kendisinin dize değerine sahiptir script, ./script, /home/user/bin/scriptya da her neyse. Tüm argümanlar olarak görünür "$1", "$2", "$3"vb vb. Argümanların sayısı kabuk değişkeninde "$#".

Bununla baş etmenin ortak yolları, kabuk komutlarını getoptsve shift. getoptsC getopt()kütüphanesi işlevi gibi bir çok şey var . shiftdeğerini taşır $2için $1, $3için $2, ve böylece; $#azalır. Kod, değerine bakmaktan, bir eyleme karar vermek için … "$1"kullanarak şeyleri yapmaktan ve ardından bir sonraki tartışmaya geçmek için bir şey yapmaktan kaynaklanır . Sadece incelemesi gerekiyor , belki de .caseesacshift$1$1$#


6
C getopt()oldukça yerleşik bir standarttır, ancak getoptçalıştırılabilir dağıtım / platformda aynı değildir. getoptsPOSIX standardı olduğu için artık tamamen dönüştürülmüş bir kullanıcıyım. Ayrıca dashbenim için çok iyi çalışıyor , bu benim tercih ettiğim senaryo kabuğu
JM Becker

165

İletilen argümanlara $nnerede n- argüman numarası - ile erişebilirsiniz 1, 2, 3, .... Argümanları tıpkı herhangi bir komutta olduğu gibi iletirsiniz.

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world


18

Formu

$ ./script.sh "$@" 

için en uygun olanıdır argv. Arg sınırlayıcısı boşluk, ancak değiştirilebilir. Ne kadar kapalı olduğunu hatırlamıyorum. Sonra kullan

 $1, $2, shift, if [ $# -ne 3 ] 

akışını kontrol etmek için. Bir case ... esacirade yeterliyse genelde getopları kucaklamam .


14

Bir bash betiğinde, şahsen parametreleri ayarlamak için aşağıdaki betiği kullanmayı seviyorum:

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

Bu yapıyla, her birinin anahtar harfini tanımladığımız için parametrelerin sırasına güvenmiyoruz. Ayrıca, yardım işlevi parametrelerin yanlış tanımlandığı her zaman yazdırılacaktır. İşlenecek farklı parametrelere sahip çok sayıda komut dosyası bulunduğunda çok yararlıdır. Aşağıdaki gibi çalışır:

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

myargument$1içeride olur myscript.




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) gereksiz 2> /dev/null, 2) mevcut cevaplara hiçbir şey eklemiyor.
ksenoit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.