假设我有一个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,这就要求我们使用隐式全局/扩展(SC2086)。(这是公平的;在最初的代码中,回显行是cp $FOO $BAR
,实际上我们不想展开$BAR
;这个错误捕获错误。)
因此,为了使这一点更加明确,我希望以下几点能够奏效:
#!/bin/bash
array=( $FOO )
echo "${array[@]}"
但不是:我们最终得到了SC2206。
是否有一种规范的方法来做这类事情,这属于ShellCheck作者认为的最佳实践?(可以随意使用www.shellcheck.net的在线检查器进行测试。)这是完全错误的做法吗?ShellCheck作者似乎从未想过这个用例.
发布于 2017-08-29 08:12:44
在这种情况下,ShellCheck的警告似乎没有一个安全的解决办法。然而,ShellCheck的诊断并不是普遍的真理。正如您可能已经注意到的,它的一些警告的文档包括一个异常部分。对于SC2206,它的内容如下:
例外情况: 如果您已经注意到(通过设置
IFS
和set -f
)使分字工作按您的意愿进行,那么可以忽略这个警告。
现在,ShellCheck提供了一个逐个案例忽略警告的指令:
Shellcheck指令允许您选择性地忽略警告,并采取文件中的注释形式: hexToAscii() {# shellcheck disable=SC2059 printf "\x$1“} 支持的指令是
disable
禁用警告:外壳检查disable=code,代码.statement_where_warning_should_be_disabled...指令而不是直接应用于整个脚本。否则,它们的作用域将被限定为它后面的结构(例如一个case语句的所有分支,或整个函数)。
因此,您可以将您的警告抑制如下:
#!/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[@]}"
https://stackoverflow.com/questions/45931553
复制相似问题