7

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

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

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

简单,你说!写吧

#!/bin/bash
echo $FOO

确实,这行得通。但它没有通过ShellCheck,这要求我们使用隐式通配/扩展(SC2086)。(这是公平的;在原始代码中, echo 行是cp $FOO $BAR,我们确实不想扩展$BAR;这个错误会捕获错误。)

因此,为了使这一点更加明确,我希望以下内容可能会起作用:

#!/bin/bash
array=( $FOO )
echo "${array[@]}"

但没有:我们最终得到SC2206

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

4

1 回答 1

7

在这种情况下,ShellCheck 的警告似乎没有安全的解决方法。然而,ShellCheck 的诊断并不是普遍的真理。您可能已经注意到,其中一些警告的文档包括一个例外部分。对于SC2206,它显示:

例外:

如果您已经注意(通过设置IFSand set -f)让分词按照您想要的方式工作,您可以忽略此警告

现在,ShellCheck 提供了根据具体情况忽略警告的指令:

Shellcheck 指令允许您选择性地忽略警告,并采用文件中的注释形式:

hexToAscii() {
  # shellcheck disable=SC2059
  printf "\x$1"
}

支持的指令是

  • disable禁用警告:

    # shellcheck disable=code[,code...]
    statement_where_warning_should_be_disabled
    

    ...

代替 shebang 或紧随其后的指令适用于整个脚本。否则,它们的作用域仅限于其后的结构(例如 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[@]}"
于 2017-08-29T08:12:44.883 回答