假设我有一个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,它使用隐式的globbing / expansion(SC2086)来调用我们。 (这是公平的;在原始代码中,回显线是cp $FOO $BAR
,确实我们并不想扩展$BAR
;此错误会捕获错误。)
所以,为了使这个更明确,我希望以下可能会有效:
#!/bin/bash
array=( $FOO )
echo "${array[@]}"
但不是:我们最终得到SC2206。
是否有规范的方式来做这种事情,这属于ShellCheck作者认为的最佳实践? (请随意使用www.shellcheck.net上的在线检查程序对其进行测试。)这完全是错误的做法吗? ShellCheck的作者似乎不太可能没想过这个用例......
答案 0 :(得分:6)
在这种情况下,ShellCheck的警告似乎没有安全的解决方法。但是,ShellCheck的诊断并不是普遍的事实。您可能已经注意到,其某些警告的文档包含例外部分。对于SC2206,它的内容为:
例外:
如果您已经注意(通过设置
IFS
和set -f
) 按照你想要的方式分词工作,你可以忽略这一点 警告强>
现在,ShellCheck提供directives根据具体情况忽略警告:
Shellcheck指令允许您有选择地忽略警告,并且 采用文件中的注释形式:
hexToAscii() { # shellcheck disable=SC2059 printf "\x$1" }
支持的指令是
disable
禁用警告:# shellcheck disable=code[,code...] statement_where_warning_should_be_disabled
...
指示而不是在shebang申请后立即执行 整个剧本。否则,它们的范围是结构 跟随它(例如案例陈述的所有分支,或整个分支) 功能)。
所以你可以按如下方式禁止你的警告:
#!/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[@]}"