假设我有一个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[@]}"