我是bash脚本的新手。我有一个需要参数的bash脚本。每次争论都不一样。这意味着争论可能是任何事情:
./script arg
该脚本应该能够解析选项:
./script -a arg
./script -b arg
./script -c arg
但是如果没有给出选项(可选),脚本必须采用-a
选项:
./script arg
与./script -a arg
./script arg
与./script -b arg
到目前为止,我建立了以下内容:
#!/bin/bash
while getopts ":a:b:c:" opt; do
case $opt in
a) opta="true" ;;
b) optb="true" ;;
c) optc="true" ;;
:) echo "option -${OPTARG} requires an argument."; exit 1;;
\?) echo "unknown option -${OPTARG}"; exit 1;;
esac
done
shift "$((OPTIND-1))"
但如果不知道如何继续。本网站的任何输入都无法回答我的问题。
修改
我找到了解决方案
prog_name=`basename $0`
a=
b=
c=
arg_idx=0
while test $# -gt 0; do
case $1 in
-*) opt_idx=1
opt_char=0
while test -n "$opt_char"; do
opt_idx=`expr $opt_idx + 1`
opt_char=`echo $1 | cut -c$opt_idx`
case $opt_char in
a) a="true" ;;
b) b="true" ;;
c) c="true" ;;
?) echo "$prog_name: $opt_char: Invalid option"
exit 1 ;;
esac
done ;;
*) arg_idx=`expr $arg_idx + 1`
case $arg_idx in
1) arg="$1" ;;
esac ;;
esac
shift
done
if [ "$arg_idx" -ne "1" ]; then
echo "Usage: $prog_name [-a] [-b] [-c] <arg>" >&2
exit 1
fi
后来在剧本中,我做了一个简单的条件:
if [ "${a}" == "true" ]; then
runA
else
if [ "${b}" == "true" ]; then
runB
else
if [ "${c}" == "true" ]; then
runC
else
runA
fi
fi
fi