Coba shFlags -- Pustaka flag baris perintah lanjutan untuk skrip shell Unix.
http://code.google.com/p/shflags/
Ini sangat bagus dan sangat fleksibel.
TIPE BENDERA:Ini adalah daftar DEFINE_* yang dapat Anda lakukan. Semua bendera menggunakan nama, nilai default, string bantuan, dan nama 'pendek' opsional (nama satu huruf). Beberapa flag memiliki argumen lain, yang dijelaskan dengan flag.
DEFINE_string:menerima input apa pun, dan mengartikannya sebagai string.
DEFINE_boolean:biasanya tidak menerima argumen apa pun:ucapkan --myflag untuk setFLAGS_myflag menjadi true, atau --nomyflag untuk menyetel FLAGS_myflag menjadi false. Sebagai alternatif, Anda dapat mengatakan--myflag=true atau --myflag=t atau --myflag=0 or--myflag=false atau --myflag=f atau --myflag=1Meneruskan opsi memiliki pengaruh yang sama dengan meneruskan opsi satu kali.
DEFINE_float:mengambil input dan mengartikannya sebagai angka floating point. Asshell tidak mendukung float per-se, input hanya divalidasi sebagai nilai floating point yang valid.
DEFINE_integer:mengambil masukan dan menafsirkannya sebagai bilangan bulat.
BENDERA KHUSUS:Ada beberapa tanda yang memiliki arti khusus:--help (atau -?) mencetak daftar semua tanda dengan cara yang dapat dibaca manusia--flagfile=foo membaca tanda dari foo. (belum diimplementasikan)-- seperti pada getopt(), menghentikan pemrosesan flag
CONTOH PENGGUNAAN:
-- begin hello.sh --
! /bin/sh
. ./shflags
DEFINE_string name 'world' "somebody's name" n
FLAGS "[email protected]" || exit $?
eval set -- "${FLAGS_ARGV}"
echo "Hello, ${FLAGS_name}."
-- end hello.sh --
$ ./hello.sh -n Kate
Hello, Kate.
Catatan:Saya mengambil teks ini dari dokumentasi shflags
Berikut adalah antarmuka argumen perintah umum yang dapat Anda tempelkan ke bagian atas semua skrip Anda.
#!/bin/bash
declare -A flags
declare -A booleans
args=()
while [ "$1" ];
do
arg=$1
if [ "${1:0:1}" == "-" ]
then
shift
rev=$(echo "$arg" | rev)
if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
then
bool=$(echo ${arg:1} | sed s/://g)
booleans[$bool]=true
echo \"$bool\" is boolean
else
value=$1
flags[${arg:1}]=$value
shift
echo \"$arg\" is flag with value \"$value\"
fi
else
args+=("$arg")
shift
echo \"$arg\" is an arg
fi
done
echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}
echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"
Dengan menjalankan perintah:
bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f
Outputnya adalah ini:
"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean
booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg
Boolean types:
Precedes Flag(pf): true
Final Arg(f): true
Colon Terminated(Ct): true
Not Mentioned(nm):
Flag: myFlag => my flag value
Args: one => firstArg, two => secondArg, three => thirdArg
Pada dasarnya, argumen dibagi menjadi flag boolean dan argumen generik. Dengan melakukannya dengan cara ini, pengguna dapat meletakkan flag dan boolean di mana saja selama dia menyimpan argumen generik (jika ada) dalam urutan yang ditentukan.
Mengizinkan saya dan sekarang Anda untuk tidak pernah berurusan dengan penguraian argumen bash lagi!
Anda dapat melihat skrip yang diperbarui di sini
Ini sangat berguna selama setahun terakhir. Sekarang dapat mensimulasikan ruang lingkup dengan mengawali variabel dengan parameter ruang lingkup.
Panggil saja script seperti
replace() (
source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
echo ${replaceFlags[f]}
echo ${replaceBooleans[b]}
)
Sepertinya saya belum mengimplementasikan cakupan argumen, tidak yakin mengapa saya rasa saya belum membutuhkannya.
Gunakan $#
untuk mengambil jumlah argumen, jika tidak sama dengan 2, argumen yang disediakan tidak cukup:
if [ $# -ne 2 ]; then
usage;
fi
Selanjutnya, periksa apakah $1
sama dengan -t
, jika tidak, bendera yang tidak dikenal digunakan:
if [ "$1" != "-t" ]; then
usage;
fi
Terakhir simpan $2
di FLAG
:
FLAG=$2
Catatan:usage()
adalah beberapa fungsi yang menunjukkan sintaks. Misalnya:
function usage {
cat << EOF
Usage: script.sh -t <application>
Performs some activity
EOF
exit 1
}
Anda harus membaca tutorial getopts ini.
Contoh dengan -a
sakelar yang membutuhkan argumen :
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
Seperti kata greybot(getopt
!=getopts
):
Perintah eksternal getopt(1) tidak pernah aman digunakan, kecuali Anda tahu itu adalah GNU getopt, Anda menyebutnya dengan cara khusus GNU, dan Anda memastikan bahwa GETOPT_COMPATIBLE tidak ada di lingkungan. Gunakan getopts (shellbuiltin) sebagai gantinya, atau cukup lewati parameter posisional.