我有一个使用testShell.sh
的shell脚本getopts
,如下所示:
#!/bin/bash
while getopts ":j:e:" option; do
case "$option" in
j) MYHOSTNAME=$OPTARG ;;
e) SCRIPT_PATH=$OPTARG ;;
*) ;;
esac
done
echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"
当我测试时运行如下:
$ testShell.sh -jvalue1 -evalue4 -Djvalue3 -pvalue2
我得到的输出如下:
j=value3
e=2
remaining=
但我希望输出为:
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
是否可以确保 getopts
仅查看第一个字符帖子 -
符号?所以它不会将-Djvalue3
解释为-jvalue3
,将-pvalue2
解释为-e2
。
答案 0 :(得分:1)
您可以在j)
之后添加中断:
#!/bin/bash
while getopts ":j:e:" option; do
case "$option" in
j) MYHOSTNAME=$OPTARG ; break ;;
e) SCRIPT_PATH=$OPTARG ;;
*) ;;
esac
done
echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"
输出:
$ bash test.sh -jvalue1 -Djvalue3 -pvalue2
j=value1
e=
remaining=-Djvalue3 -pvalue2
在选项/参数之间输出空格:
$ bash test.sh -jvalue1 -evalue4 -D jvalue3 -p value2
j=value1
e=value4
remaining=jvalue3 -p value2
答案 1 :(得分:1)
在3个论坛上发布并在任何地方搜索后...最终我尝试了以下内容并且有效...
testShell.sh -jvalue1 -evalue4 -- -Djvalue3 -pvalue2
注意
--
在-evalue4
之后
输出
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
我相信--
要求getopts
停止处理选项。
编辑: Here是解释这项工作的链接。
答案 2 :(得分:1)
您可以手动执行选项处理:
set -- -jvalue1 -evalue4 -Djvalue3 -pvalue2
remaining=()
for arg; do
case $arg in
-j*) j=${arg#-j} ;;
-e*) e=${arg#-e} ;;
*) remaining+=($arg) ;;
esac
done
printf "%s='%s'\n" j "$j" e "$e" remaining "${remaining[*]}"
输出
j='value1'
e='value4'
remaining='-Djvalue3 -pvalue2'
这样您就不必依赖用户以特定方式输入参数,例如在中间添加--
,或强制-j
和-e
来第一