Bash - 带空格的可选参数

时间:2018-03-13 18:02:59

标签: bash shell command-line-arguments

我有一个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语句的任何方法可以使这个工作吗?

我发现了几个关于可选参数或带有空格的参数的问题,例如thisthisthis,但我找不到我要求的任何参数。< / p>

1 个答案:

答案 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[@]}"