basit bir Bash komutu düşünelim
ls -l /var/
Burada “-l” option ve “/var/” ise Argümandır.
getops positional parametreleri takip eder. Bashte bunlar shell değişkeni “$@” ile tutulur.
Dolayısıyla aşağıda ki komutu incelediğimizde.
$ komutum -a argüman1 -b argüman2
Bu durumda $@ içinde ” -a argüman1 -b argüman2
” bulunur ve getops bunu parçalayarak kullanabilir.
Getops her çalıştırıldığında optstring ile tanımlanan bir option ı arar. Eğer bulursa optname ile belirlenen değişkene atar. Eğer optstring ile belirlenenlere uymaz ise optname i soru işareti olarak alır “?”.
eğer option bir argüman bekliyorsa getopts o argümanı alır ve $OPTARG değişkeni ile saklar. Eğer beklenen argüman bulunamadıysa optname i iki nokta üstüste (“:”) olarak alır. Daha sonra pozisyon indexini bir artırır $OPTIND, bu bir sonraki option ın işleneceği anlamına gelir.
Getopts loop ile birkaç defa çalıştırılacak şekilde düşünümüştür. Her döngüde bir option ı işleyecektir. Option kalmayınca false geri döndürecektir. Bu nedenle while ile kullanılır çoğu zaman.
OPTSTRING in tanımlanması
optstring getopts un hangi option ve argümanları arayacağının tanımlandığı string dir.
getops "trY" optname
getopts tarafından beklenen optionlar -t, -r ve -Y dir ve bunların argümanları yoktur. Her hangi bir sıra ile gelebilirler; -tr, -rY, Yrt ….gibi.
Eğer -t ve -r inin argümanda almasını istiyorsak optstring içinde arkasına (“:”) koyarız.
getopts "a:rY:" optname
Burada -r agrüman almaz çünkü sonrasında (“:”) yoktur.
artık -a ve -Y ye argüman tanımlayabilir ve
-a argüman1 -rY argüman2
şeklinde kullanabiliriz. Eğer option doğru fakat beklenen argüman yok ise optname “?” olur ve $OPTARG boş kalır ve verbose hata mesajı yazılır.
Ancak eğer sessiz moda almak istersek optstring in başına (“:”) konur ve böylece script hata mesajı ile sonlanmaz hata kontrolünü script içinde yapmamız gerekir.
Sessiz modda eğer beklenmeyen bir option gelirse optname “?” olur ve $OPTARG bilinmeyen option karakteri olur.
Eğer option doğru ancak argüman bulunmaz ise, optname (“:”) olur ve $OPTARG bilinmeyen option karakteri olur.
OPTARG getopts içinde bir built in değişkendir deklare etmeye gerek yoktur. Aşağıda ki örnekte -n ile gelen ilk argümanı tutacaktır ilk turunda.
Sadece -n ve -t bekliyoruz başka bir option gelirse
\?) –> bloğu çalışacak bilinmeyen option diyecek ve OPTARG ı yazacak
🙂 –> bu blok eğer -n veya -t her hangi bir argüman almaz ise çalışacak.
*) –> yukarıda ki hatalardan hiç biri lmaz ancak yinede uygun olmayan bir durum olursa çalışacak.
Örnek :
#!/bin/bash
NAME="" # Name of person to greet.
TIMES=1 # Number of greetings to give.
usage() { # Function: Print a help message.
echo "Usage: $0 [ -n NAME ] [ -t TIMES ]" 1>&2
}
exit_abnormal() { # Function: Exit with error.
usage
exit 1
}
while getopts ":n:t:" options; do # Loop: Get the next option;
# use silent error checking;
# options n and t take arguments.
case "${options}" in #
n) # If the option is n,
NAME=${OPTARG} # set $NAME to specified value.
;; #
t) # If the option is t,
TIMES=${OPTARG} # Set $TIMES to specified value.
re_isanum='^[0-9]+$' # Regex: match whole numbers only
if ! [[ $TIMES =~ $re_isanum ]] ; then # if $TIMES not whole:
echo "Error: TIMES must be a positive, whole number." #
exit_abnormal
exit 1
elif [ $TIMES -eq "0" ]; then # If it's zero:
echo "Error: TIMES must be greater than zero."
exit_abnormal # Exit abnormally.
fi #
;; #
:) # If expected argument omitted:
echo "Error: -${OPTARG} requires an argument." #
exit_abnormal # Exit abnormally.
;; #
\?) # If unexpected option came:
echo "Unknow option: -" ${OPTARG} # Print error
;; #
*) # If unknown (any other) option:
exit_abnormal # Exit abnormally.
;; #
esac #
done
if [ "$NAME" = "" ]; then # If $NAME is an empty string,
usage # our greeting usage
else # Otherwise,
STRING="Hi, $NAME!" # it is "Hi, (name)!"
fi
COUNT=1 # A counter.
while [ $COUNT -le $TIMES ]; do # While counter is less than
# or equal to $TIMES,
echo $STRING # print a greeting,
let COUNT+=1 # then increment the counter.
done #
exit 0