假设我有一个shell脚本test.sh,它应该回显一些值。我希望能够通过具有glob扩展的环境变量来传递这些值:

$ ls
1.js  2.js  test.sh*

$ FOO="*.js" bash ./test.sh
1.js 2.js

简单,你说!写就好了
#!/bin/bash
echo $FOO

确实,这可行。但是它没有传递ShellCheck,这使我们无法使用隐式globing/expansion(SC2086)。 (这很公平;在原始代码中,回显行是cp $FOO $BAR,实际上我们不想扩展$BAR;此错误捕获了错误。)

因此,为了使这一点更加明确,我希望以下方法可行:
#!/bin/bash
array=( $FOO )
echo "${array[@]}"

但没有:我们最终得到SC2206

是否有一种规范的方式来做这种事情,而这正是ShellCheck作者认为是最佳实践的范畴? (可以免费使用www.shellcheck.net上的在线检查器进行测试。)这完全是错误的方法吗? ShellCheck作者似乎不太可能从未想到过这个用例...

最佳答案

在这种情况下,对于ShellCheck的警告似乎没有安全的解决方法。但是,ShellCheck的诊断不是普遍真理。您可能已经注意到,某些警告的文档包括异常(exception)部分。对于SC2206,其内容为:



现在,ShellCheck提供了directives来视情况忽略警告:



因此,可以按以下方式禁止显示警告:

#!/usr/bin/env bash

# The following line is needed so that the shellcheck directive
# below doesn't have global effect
:

# shellcheck disable=SC2206
array=( $FOO )
echo "${array[@]}"

10-08 07:40