我有一个bash脚本,我想用它将带有空格的可选参数传递给另一个脚本。 我的脚本(pass_optional_arg.sh)如下所示:
#!/usr/bin/env bash
mandatory_arg=${1}
if [[ -z ${mandatory_arg} ]]
then
echo "Mandatory arg missing"
exit 1
fi
optional_arg=${2}
./echo_args.sh ${mandatory_arg} an_irrelevant_arg "${optional_arg}"
脚本echo_args.sh只是用单引号打印参数,以及它们的编号:
#!/usr/bin/env bash
echo "Number of args: ${#}"
for var in "${@}"
do
echo "Arg: '"${var}"'"
done
运行./pass_optional_arg.sh a_mandatory_arg 'an arg with spaces'
参数数量:3
Arg:'a_mandatory_arg'
Arg:'an_irrelevant_arg'
Arg:'带空格的arg'
这正是我想要的。
但是,如果我在没有提供可选参数的情况下运行:
./pass_optional_arg.sh a_mandatory_arg
参数数量:3
Arg:'a_mandatory_arg'
Arg:'an_irrelevant_arg'
Arg:''
在这种情况下,我希望参数为2,而不是最后的空arg。
如果我更改pass_optional_arg.sh的最后一行,则删除可选参数./echo_args.sh ${mandatory_arg} an_irrelevant_arg ${optional_arg}
然后第二种情况是固定的,但第一种情况是:
./pass_optional_arg.sh a_mandatory_arg 'an arg with spaces'
args数:6
Arg:'a_mandatory_arg'
Arg:'an_irrelevant_arg'
Arg:'an'
Arg:'arg'
Arg:'with'
Arg:'spaces'
当然,我可以使用if语句来满足这两种情况
if [[ -z ${optional_arg} ]]
then
./echo_args.sh ${mandatory_arg} an_irrelevant_arg
else
./echo_args.sh ${mandatory_arg} an_irrelevant_arg "${optional_arg}"
fi
对于像这样的小命令,这可能没什么问题,但是无法扩展为几个可选参数。对于非常复杂和冗长的命令,不得不像这样复制它并不理想。没有上述if语句的任何方法可以使这个工作吗?
我发现了几个关于可选参数或带有空格的参数的问题,例如this,this和this,但我找不到我要求的任何参数。< / p>
答案 0 :(得分:0)
你需要某个条件,因为"..."
始终是一个独特的参数,即使...
为空。顺便说一下,你绝对想引用所有参数扩展:
./echo_args.sh "${mandatory_arg}" an_irrelevant_arg "${optional_arg}"
您可能想要使用数组:
mandatory_arg=${1}
# Check $# directly; just because $1 is empty doesn't mean it is *missing*
if (( $# < 1 ))
then
echo "Mandatory arg missing"
exit 1
fi
# Or simply
# mandatory_arg=${1:?Mandatory arg missing}
args=( "$mandatory_arg" an_irrelevant_arg )
(( $# >= 2 )) && args+=("$2")
./echo_args.sh "${args[@]}"