Bash 同时使用getopts和${1}
我正在尝试编写一个脚本,它可以同时使用${1}和getopts选项。我希望它能够使用使用行:Bash 同时使用getopts和${1},bash,getopts,Bash,Getopts,我正在尝试编写一个脚本,它可以同时使用${1}和getopts选项。我希望它能够使用使用行: ./test_script test -a 要打印: test -a was triggered! 我试过了 echo ${1}; while getopts "c:a" opt; do case $opt in a) echo "-a was triggered!" >&2 ;; \?) echo "Invalid o
./test_script test -a
要打印:
test
-a was triggered!
我试过了
echo ${1};
while getopts "c:a" opt; do
case $opt in
a)
echo "-a was triggered!" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
它不能让我同时访问${1}并检测到-a选项被同时使用。有没有办法同时使用这两种方法?我希望避免将测试字符串转换为另一个getopts选项。您可以在getopts退出时使用shift。
例如:
while [ $# -gt 0 ] ; do
while getopts "c:a" opt ; do
case $opt in
# YOUR OPTIONS
esac
done
OTHER_VALUE=$1
shift
done
PS:通常我不使用getopts,但我更喜欢自己解析args,如下所示:
while [ $# -gt 0 ] ; do
case "$1" in
'-a' | '--along' )
echo '-a was triggered' ;;
'-b' | '--blong' )
echo '-b was trigger with arg ' $2 ;
shift ;; # One extra shift for the argumnent $2
* )
echo 'Unknown value (maybe test)' ;;
esac
shift
done
我不明白你在问什么。您可以访问
$1
,并且可以检测到-a
已传递给脚本。那你到底不能做什么呢?我两个都不能。对于上面的脚本,如果我这样做。/test\u script test-a,输出就是“test”。。。如果我这样做。/test\u script-a测试输出为“-a\n-a已触发!”。。。我希望输出“test\n-a已触发!”您的问题似乎是getopts
在第一个非选项之后停止。意思是/test\u script-a test
可以正常工作,但是/test\u script test-a
不能。。。getopts
手册页上说:以下任何一项都应标识选项的结尾:特殊选项“-”,查找不以“-”开头的参数,或遇到错误。
注意@twalberg描述的行为是标准的(只要有标准)shell命令语法:选项位于常规参数之前。有些命令允许选项跟随常规参数,但这是不标准的。