所以我一直在阅读有关getopts,getopt等的内容,但我还没有找到解决问题的确切方法。
使用我的脚本的基本思路是:
./program [-u] [-s] [-d] <TEXT>
如果传递-d,则不需要TEXT。请注意,TEXT通常是一段文字。
我的主要问题是,一旦getopts完成解析标志,我无法知道TEXT参数的位置。我可以假设TEXT是最后一个参数,但是,如果用户搞砸了并做了类似的事情:
./program -u "sentence 1" "sentence 2"
然后程序将不会意识到使用不正确。
我最接近的是通过
使用getopt和IFSARGS=$(getopt usd: $*)
IFS=' ' read -a array <<< "$ARGS"
唯一的问题是TEXT可能是一段很长的文本,而且由于空格,这个方法会分割文本的每个单词。
我认为我最好的选择是使用正则表达式来确保正确形成用法,然后使用getopts提取参数,但如果有更简单的解决方案那就更好了
答案 0 :(得分:3)
使用getopts
非常简单:
#!/bin/bash
u_set=0
s_set=0
d_set=0
while getopts usd OPT; do
case "$OPT" in
u) u_set=1;;
s) s_set=1;;
d) d_set=1;;
*) # getopts produces error
exit 1;;
esac
done
if ((!d_set && OPTIND>$#)); then
echo You must provide text or use -d >>/dev/stderr
exit 1
fi
# The easiest way to get rid of the processed options:
shift $((OPTIND-1))
# This will run all of the remaining arguments together with spaces between them:
TEXT="$*"
答案 1 :(得分:0)
这就是我通常做的事情:
local badflag=""
local aflag=""
local bflag=""
local cflag=""
local dflag=""
while [[ "$1" == -* ]]; do
case $1 in
-a)
aflag="-a"
;;
-b)
bflag="-b"
;;
-c)
cflag="-c"
;;
-d)
dflag="-d"
;;
*)
badflag=$1
;;
esac
shift
done
if [ "$badflag" != "" ]; do
echo "ERROR CONDITION"
fi
if [ "$1" == "" ] && [ "$dflag" == "" ]; do
echo "ERROR CONDITION"
fi
local remaining_text=$@