如何在传递ShellCheck

时间:2017-08-29 05:51:05

标签: bash shell shellcheck

假设我有一个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的作者似乎不太可能没想过这个用例......

1 个答案:

答案 0 :(得分:6)

在这种情况下,ShellCheck的警告似乎没有安全的解决方法。但是,ShellCheck的诊断并不是普遍的事实。您可能已经注意到,其某些警告的文档包含例外部分。对于SC2206,它的内容为:

  

例外:

     

如果您已经注意(通过设置IFSset -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[@]}"