Shellcheck 批准了一种将一个变量中的 2 个参数传递给 bash 脚本中的命令的方法

Ama*_*rus 6 bash shell-script shellcheck

在 bash 脚本中,我调用另一个程序,但我想使用命令行选项配置该程序。以下作品:

\n
AREA_ARG=""\nif __SOME_SETTING__ ; then\n  AREA_ARG=" --area us,ca "\nfi\n\nprocess_data -i /some/path $AREA_ARG\n
Run Code Online (Sandbox Code Playgroud)\n

即 bash 执行process_data -i /some/path, 或process_data -i /some/path --area us,ca

\n

然而shellcheck抱怨!

\n
$ shellcheck test.sh \n\nIn test.sh line 7:\nprocess_data -i /some/path $AREA_ARG\n                           ^-------^ SC2086: Double quote to prevent globbing and word splitting.\n\nDid you mean: \nprocess_data -i /some/path "$AREA_ARG"\n\nFor more information:\n  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...\n
Run Code Online (Sandbox Code Playgroud)\n

我理解原理,但我希望/需要变量在空间上分割,以便process_data获得 2 个参数。

\n

在 中执行此操作的正确方法是什么bash

\n

ctr*_*lor 14

使用数组

这是使用数组重写的代码。也是一个工作示例(ls代替您的命令),并使用正确的变量大小写(编码标准规定大写名称是为系统保留的)。

#!/bin/bash

area_args=()
if true ; then
  area_args=(-l -a)
fi

ls "${area_args[@]}"
Run Code Online (Sandbox Code Playgroud)

  • @roaima,...好吧,`sh` 在每个上下文(参数列表)中支持_恰好一个_数组。在这里使用它可能类似于:`set --` 相当于 `area_args=( )`,然后 `set -- -l -a` 与 `areas_args=( -l -a )`,然后是 `ls "$@"` 来实际传递它们。 (2认同)

Cha*_*ffy 6

对于您的具体用例,有一个更简单的答案:

unset -v area
if __SOME_SETTING__; then
  area="ca,us"
fi

process_data -i /some/path ${area+ --area "$area" }
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因您无法使用数组,并且您需要比上述实践提供的更多控制,您可以考虑使用函数包装器。

withOptionalArea() {
  if __SOME_SETTING__; then
    "$@" --area us,ca
  else
    "$@"
  fi
}

withOptionalArea process_data -i /some/path
Run Code Online (Sandbox Code Playgroud)

...但这应该只在特殊情况下才有必要。


确实,使用数组。