Yanıtlar:
Kabuk komut ve bu komuta herhangi argümanlar olarak görünür numaralı kabuk değişkenleri: $0
gibi bir şey komutunun kendisinin dize değerine sahiptir script
, ./script
, /home/user/bin/script
ya 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ı getopts
ve shift
. getopts
C getopt()
kütüphanesi işlevi gibi bir çok şey var . shift
değerini taşır $2
için $1
, $3
iç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 .case
esac
shift
$1
$1
$#
$/shellscriptname.sh argument1 argument2 argument3
Ayrıca bir kabuk betiğinin çıktısını başka bir kabuk betiğine argüman olarak iletebilirsiniz.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
Kabuk betiği içinde $1
, birinci argüman ve $2
ikinci argüman gibi sayılarla argümanlara erişebilirsiniz .
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 ... esac
irade yeterliyse genelde getopları kucaklamam .
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
Kabuk komut dosyasında; $ 1 değişken adı olur. İkinci kelime $ 2 değişken ismi olur ve böyle devam eder.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
Daha fazla belki kabuk (sh) kılavuzunda http://heirloom.sourceforge.net/sh/sh.1.html adresinde bulunabilir.
Python argümanı ile aşina iseniz ve bash argümanlarını ayrıştırmak için python çağırmayı sakıncası yoksa, bash argümanı kullanın ( https://github.com/mattbryson/bash-arg-parse ),
Burada aynı cevaba bakınız: 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) mevcut cevaplara hiçbir şey eklemiyor.
getopt()
oldukça yerleşik bir standarttır, ancakgetopt
çalıştırılabilir dağıtım / platformda aynı değildir.getopts
POSIX standardı olduğu için artık tamamen dönüştürülmüş bir kullanıcıyım. Ayrıcadash
benim için çok iyi çalışıyor , bu benim tercih ettiğim senaryo kabuğu