Atau untuk apa yang tampak seperti pembantaian yang merajalela, tetapi sebenarnya sederhana ... Cukup banyak mencakup semua kasus Anda, dan tidak ada string kosong atau masalah yang tidak disadari.
Dalam kasus ini, argumen pertama adalah '-v', lalu lakukan kondisional Anda ps -ef, jika tidak, dalam semua kasus lainnya buang penggunaan.
#!/bin/sh
case $1 in
'-v') if [ "$1" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi;;
*) echo "usage: $0 [-v]"
exit 1;; #It is good practice to throw a code, hence allowing $? check
esac
Jika seseorang tidak peduli di mana argumen '-v' berada, maka cukup letakkan case di dalam satu lingkaran. Itu akan memungkinkan berjalannya semua argumen dan menemukan '-v' di mana saja (asalkan ada). Ini berarti urutan argumen baris perintah tidak penting. Diperingatkan, seperti yang disajikan, variabel arg_match disetel, jadi ini hanyalah sebuah bendera. Ini memungkinkan beberapa kemunculan argumen '-v'. Seseorang dapat mengabaikan semua kemunculan '-v' lainnya dengan cukup mudah.
#!/bin/sh
usage ()
{
echo "usage: $0 [-v]"
exit 1
}
unset arg_match
for arg in $*
do
case $arg in
'-v') if [ "$arg" = -v ]; then
echo "`ps -ef | grep -v '\['`"
else
echo "`ps -ef | grep '\[' | grep root`"
fi
arg_match=1;; # this is set, but could increment.
*) ;;
esac
done
if [ ! $arg_match ]
then
usage
fi
Tapi, memungkinkan beberapa kemunculan argumen nyaman digunakan dalam situasi seperti:
$ adduser -u:sam -s -f -u:bob -trace -verbose
Kami tidak peduli tentang urutan argumen, dan bahkan mengizinkan beberapa argumen -u. Ya, mengizinkan juga:
$ adduser -u sam -s -f -u bob -trace -verbose
echo "usage: $0 [-v]";$-menunjukkan tanda opsi shell aktif, bukan nama skrip saat ini.