5

我在我的脚本上运行shellcheck并且经常收到这个警告(在这种情况下是正确的,因为cd foo bar baz没有意义):

cd ${SOME_DIR} || exit 1
   ^-- SC2046: Quote this to prevent word splitting.

这个警告大多是好的。变量包含多个参数时的一种例外情况:

gcc ${OPTIONS} ...
    ^-- SC2046: Quote this to prevent word splitting.

是否有更明确的关于故意分词的约定,可能避免这个 shellcheck 警告?

4

3 回答 3

11

当没有拆分的意图时,只需添加双引号:

cd "${SOME_DIR}" || exit 1

执行显式拆分为数组:

read -ra gcc_options <<<"${OPTIONS}"
gcc "${gcc_options[@]}"

或者为下一条语句禁用 shellcheck,表明您已将操作视为符合意图:

# shellcheck disable=SC2046 # Intended splitting of OPTIONS
gcc ${OPTIONS}

有时,阅读《精细手册在这里提问更好:

Shellcheck 提供指向其 Wiki 的链接以获取代码检查警告。SC2046 Quote this to prevent word split wiki 条目已经提到了read -a在 Bash 中的使用以及如何针对非 Bash shell 语法的特定情况禁用此代码检查。

于 2020-06-29T12:40:10.727 回答
0

在您的脚本中,表单的注释# shellcheck disable=...将禁用特定警告。

options="a b c"
# shellcheck disable=2086
foo $options

如果您在shellcheck本地运行脚本,则可以使用该-e选项而不是向脚本添加指令。

$ cat tmp.sh
#/bin/sh

options="a b c"

foo $options
$ shellcheck tmp.sh

In tmp.sh line 5:
foo $options
    ^------^ SC2086: Double quote to prevent globbing and word splitting.

Did you mean:
foo "$options"

For more information:
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
$ spellcheck -e SC2086 foo.sh
$
于 2020-06-29T12:38:10.770 回答
-1

在您展示的任何情况下,没有理由不引用扩展。使用引号。

是否有更明确的关于故意分词的约定,可能避免这个 shellcheck 警告?

约定是使用mapfileor执行分词read -a

如果您真的想使用分词,那么约定是添加注释来解释您的代码想要依赖分词的原因,然后您还可以添加警告:

# I use word splitting here, because...
# shellcheck disable=SC2046

要禁用 shellcheck 警告,请参阅shellcheck/wiki/ignore

注意:在脚本中使用小写变量。按照惯例,大写变量用于导出变量等PATH PWD UID COLUMNS LINES

于 2020-06-29T12:44:42.507 回答