首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shellcheck批准将一个变量中的2个参数传递给bash脚本中的命令

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

Unix & Linux用户
提问于 2022-05-18 09:15:06
回答 4查看 1.6K关注 0票数 5

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

代码语言:javascript
复制
AREA_ARG=""
if __SOME_SETTING__ ; then
  AREA_ARG=" --area us,ca "
fi

process_data -i /some/path $AREA_ARG

也就是说,bash要么执行process_data -i /some/path,要么执行process_data -i /some/path --area us,ca

然而,shellcheck抱怨!

代码语言:javascript
复制
$ shellcheck test.sh 

In test.sh line 7:
process_data -i /some/path $AREA_ARG
                           ^-------^ SC2086: Double quote to prevent globbing and word splitting.

Did you mean: 
process_data -i /some/path "$AREA_ARG"

For more information:
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...

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

bash中,™做这件事的正确方式是什么?

EN

回答 4

Unix & Linux用户

回答已采纳

发布于 2022-05-18 09:33:43

使用数组

下面是使用数组重新编写的代码。也可以作为一个工作示例(ls代替您的命令),并对变量使用正确的大小写(编码标准说大写名称保留给系统)。

代码语言:javascript
复制
#!/bin/bash

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

ls "${area_args[@]}"
票数 13
EN

Unix & Linux用户

发布于 2022-05-18 19:20:29

对于特定的用例,有一个简单得多的答案:

代码语言:javascript
复制
unset -v area
if __SOME_SETTING__; then
  area="ca,us"
fi

process_data -i /some/path ${area+ --area "$area" }

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

代码语言:javascript
复制
withOptionalArea() {
  if __SOME_SETTING__; then
    "$@" --area us,ca
  else
    "$@"
  fi
}

withOptionalArea process_data -i /some/path

...but只有在特殊情况下才有必要这样做。

真的,使用数组。

票数 6
EN

Unix & Linux用户

发布于 2022-05-18 19:29:04

在变量中存储任意命令或参数的正确方法是使用数组,请参阅如何运行存储在变量中的命令?

但是,您可以告诉should检查您喜欢它的方式,只要您确信它是好的(也就是说,您没有应该保持不变的空白,或者没有可能导致问题的单词,并且没有将IFS更改为会破坏它的东西):

代码语言:javascript
复制
AREA_ARG=""
if __SOME_SETTING__ ; then
  AREA_ARG=" --area us,ca "
fi


# shellcheck disable=SC2086 # split on purpose
process_data -i /some/path $AREA_ARG

请参阅https://www.shellcheck.net/wiki/Directive

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/702993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档