我想编写一个 shell 脚本,它将接受一些参数和一些选项并打印这些参数。假设该脚本的名称是abc.ksh
.该脚本的用法是 -
./abc.ksh -[a <arg>|b <arg>|c|d] <some_string>
现在我编写一个 shell 脚本,它将采用选项和参数
#!/bin/ksh
# Default Values
vara=","
varb=false
varbname=""
varc=false
# Scanning inputs
while getopts :a:b:cd option
do
case $option in
a) vara=$OPTARG;;
#shift $((OPTIND-1));;
b) varb=true
varbname=$OPTARG;;
#shift $((OPTIND-1));;
c) varc=true;;
#shift $((OPTIND-1));;
d) echo "Usage $0 \-[a|b|c|d] <filename>"
exit 0;;
\?) echo "Invalid option -$OPTARG. Please run '$0 -h' for help"
exit 1;;
:) echo "Option -$OPTARG requires an argument. Please run '$0 -d' for help"
exit 1;;
esac
done
print "Args: $* \nvara: $vara \noptfile: $varb \nvarbname: $varbname \nvarc: $varc"
正确输入的示例:
./abc.ksh -a "sample text" "some_string"
./abc.ksh "some_string" -a "sample text"
./abc.ksh -asample\ text some_string
- ETC...
some_string
我的脚本中没有捕获输入。我怎样才能抓住它?
答案1
程序通常会强制“some_string”部分作为最后一个参数,因此这.abc.ksh "some_string" -a "sample text"
是一个错误。如果这样做,则在解析选项后,将保留最后一个参数(部分)$OPTIND
的索引。"some_string"
如果这是不可接受的,那么您可以在开头(在输入之前检查while
是否存在非前缀参数。这将让您"some_string"
在开头和结尾处都有。如果您需要在中间,您可以不使用getopts
,也可以有两组getopts
. 当第一个错误时,可能是由于无前缀参数;获取它并开始一个新的getopts
以获取剩余的参数。一起推出您自己的解决方案。
答案2
捕获您的选择后
shift $OPTIND
if [ $# -eq 1 ]; then
some_str="$1"
else
echo "Error: missing argument" >&2
fi