shellcheck:shell脚本的静态分析工具

2021-03-19 03:46:24

要指出并澄清典型的初学者' s语法问题,导致shellto给出密码错误消息。

要指出并澄清典型的中间水平语义问题,因为壳体奇怪地和反向直观地表现出来。

要指出可能导致Asadvanced User'否则工作脚本的微妙警告,角落案例和陷阱在未来的情况下失败。

查看错误代码库,了解麦克检查可以帮助您识别的情况!

ShellCheck.net始终与最新的Git提交同步,并且是最简单的方法来提供Go的方法。告诉你的朋友!

虽然ShellCheck主要用于交互式使用,但它可以轻松添加到构建或测试套件中。它使得规范使用退出代码,因此只需将shellcheck命令添加为进程的一部分。

大多数其他服务(包括Gitlab),让您通过系统' s包管理器(请参阅安装),或者通过下载和解包二进制版本来安装shellcheck。

它是一个好主意,无论如何手动安装特定的shellcheck版本。这避免了惊讶的建立在发布新警告的新版本时突破。

对于自定义过滤或报告,ShellCheck可以输出简单的JSON,CheckStyle兼容的XML,GCC兼容警告以及人类可读文本(有或没有ANSI颜色)。有关更多文档,请参阅Integration Wiki页面。

Docker运行--rm -v" $ PWD:/ MNT" Koalaman / shellcheck:稳定MyScript#或:V0.4.7的该版本,或:最新用于日常构建

或者使用Koalaman / shellcheck-Alpine如果您希望更大的高山Linux基于的图像扩展。它与常规的高山图像完全相同,但预先安装了shellcheck。

或者看到其他版本的GitHub版本(包括日常git构建的最新元释放)。

发行版已经带有一个手册页。如果您正在从源代码构建,可以安装:

Travis CI现在已经集成了Shellcheck默认情况下,因此您不需要手动安装它。

如果您仍然想要这样做,以便升级您的休闲或确保您'重用最新版本,请按照以下步骤安装二进制版本。

预编译的二进制文件来自tar.xz文件。要解压缩它们,请确保安装XZ.ON Debian / Ubuntu / MINT,您可以APT安装XZ-Utils.on RedHat / Fedora / CentOS,Yum -y Install XZ。

本节介绍如何从源目录中构建shellcheck。 shellcheck是用Haskell编写的,需要2GB的RAM编译。

Shellcheck使用Cabal建造和包装。从系统和#39; s包管理器安装包裹架(用e,apt-get,brew,Emerge,yum或zypper)。

在MacOS(OS X)上,您可以使用BREW快速安装Cabal,如果您尝试从源代码编译它,则需要几分钟而不是超过30分钟。

在Macports上,包代替hs-cabal-install,而本机Windows用户应该从https://www.haskell.org/platform/安装最新版本的haskell平台

在本机窗口中,应该已经设置了路径,但系统可以使用传统代码页。在CMD.EXE中,PowerShell.exe和PowerShell ISE,确保使用TrueType字体,而不是栅格字体,并将ActiveCodePage与CHCP一起设置为UTF-8(65001):

那么Shellcheck寻找什么样的东西?以下是检测到的问题的不完整列表。

回声$ 1#未引用的variablesfind。 - 名称* .ogg#未引版的查找/ grep patternsrm"〜/ my file.txt" #quoted tilde扩展=' - verbose ="真" ' ; CMD $ V#文字引号在&#34中的变量中; *。ogg" #错误引用'对于' loopstouch $ @#未引用$ @ echo'别忘了重启! ' #operquote opostrophe echo&#39关闭; Don \' t在家里尝试这个' #尝试逃脱'在' '回声'路径是$ path'单引号陷阱&#34中的变量; echo取$ {秒} s" 0#过早扩展陷阱

[[n!= 0]]#常量测试表达式[[-e * .mpg]]#存在的存在检查[[$ foo == 0]]#由于缺少空格而始终为true [[-n" $ foo" ]]#由于文字,总是如此[[$ foo =" fo +" ]]#引用正则表达式=〜[foo =〜re]#unsupported []运算符[$ 1-eq" shellcheck" ]#字符串的数字比较[$ n&& $ m]#&&在没有$(..)的[...] [grep-q foo文件]#命令[[" $$文件" == * .jpg]]#Compers' t成功的比较((1 -lt 2))#使用测试运算符((。))

grep' * foo *' Regex ContextSFind中的文件#lobs。 -exec foo {}&&酒吧 {} \; #过早地终止查找-execsudo回声' var = 42' > / etc / profile#重定向sudo time --format =%s睡眠10#通过时间(1)标志在读取h时立即内置。 do ssh" $ h"正常运行时间#命令循环输入别名archive =' mv $ 1 / backup' #定义参数-cd&#39的别名; [a-za-z0-9]' #[] TREC FOO的范围周围;回声"完成! " #误用' exec' find -name \ *。bak -o -name \ *〜-delete#隐含优先级查找#查找。 -exec foo>酒吧 \;在查找f(){whoami中的重定向; }; sudo f#外部使用内部功能

var = 42#space any and in resimments $ foo = 42#$在* $ var in *; do ...#$in for wood variablesvar $ n ="你好" #错误的间接分配echo $ {var $ n}#错误的间接参考Var =(1,2,3)#逗号分隔的Arraysarray =([index] = value)#不正确的索引初始化回声$ var [14]#缺少{}数组参考回声"参数10是10美元" #位置参数错误引用如果$(myfunction);然后 .. ; Fi #we $()else otherfonitions的命令;然后.. ..#使用'否则if' f; f(){echo"你好世界;在定义之前使用函数[false]#' false'如果(-f文件)#使用(..)而不是测试

[ - [-z $(find / tmp | grep mpg)]]#使用grep-q而不是gt;>日志 ; B>>日志 ; C>> log#使用重定向块,而是回声"时间是“日期”" #使用$()代替CD DIR;过程 * ; CD ..; #使用子屏幕改装echo $ [1 + 2]#使用标准$((..))而不是旧$ []回声$(($随机%6))#don' t使用$ in $上的变量(...))回声" $(日期)" #无用使用echocat文件| grep foo#无用使用猫

args =" $ @" #分配给stringsfiles =(foo bar);回声" $文件" #引用阵列作为字符串声明-a arr =(foo bar)#没有索引printf"%s \ n&#34的关联阵列; "争论:$ @。 " #连接字符串和数组[[$#> 2]#将数字与Stringsvar =世界进行比较; echo"你好" var#未使用的小写变量echo" hello $ name" #未分配的小写variablescmd |读栏; Subshel​​lscat Foo的Echo $酒吧#作业CP栏#管道向命令' t read printf'%s:%s \ n' foo#在printf参数计数中不匹配

RM -RF" $ Steamroot /" *#灾难性RMTOUCH ./-; LS *#可能成为选项的地球。 -exec sh -c' a&& b {}' \ #find -exec shell注入printf"你好$ name" #f for f的printf格式的变量(ls * .txt); Do#迭代LS输出导出myvar = $(cmd)#masked退出代码案例$版本在2. *):;; 2.6。 *)#阴影案例分支

Shellcheck将在使用Shebang不支持的功能时警告。例如,如果您将Shebang设置为#!/ bin / sh,Shellcheck将警告类似于CheckBashisms的可移植性问题:

echo {1 .. $ n}#在ksh中工作,但不是bash / dash / sh echo {1..10}#在ksh和bash工作,但不是dash / sh echo-n 42#工作在Ksh,Bash和短划线,在陷阱&#39中未定义; 42' SIGINT#异商信号SCOMCMD& >文件#不可经济的重定向运营商读取foo< / dev / tcp / host / 22 #unportable截取的文件foo-bar(){..; }#未定义/不受支持的函数名称[$ uid = 0]#变量未定义在dash / sh local var = value#local在sh时间​​睡眠中未定义1 |睡眠5#未定义的用途'时间'

ps1 =' \ e [0; 32m \ $ \ e [0m' #ps1颜色不在\ [.. .. \]路径=" $ path:〜/ bin" #literal tilde在$ pathrm“file”#unicode引号echo"你好世界" #托运返回/ doS线结尾echo hello \#尾随空格\ var = 42 echo $ var#扩展内环环境#!/ bin / bash -x -e#常见的shebang错误回声$((n / 180 * 100) )#不必要的Precisionls丢失* [:Digit:]。TXT#坏字符类Globsed' s / foo / bar /'文件>文件#重定向到输入而getopts" a" F ;在" b")#unhandled getopts标志

起初你'重新喜欢"萨伯检查很棒"但是你'重新喜欢" wtf我们仍然使用bash"

可以通过环境变量,命令行,在文件中单独或全局忽略问题:

请将修补程序提交到代码或文档作为GitHub拉请求!在TheShellcheck Wiki上查看DevGuide。

Shellcheck在GNU通用公共许可证下获得许可,V3。 文件许可证中包含此许可证的副本。 ShellCheck不会尝试强制执行任何类型的格式或缩进样式,所以还要查看SHFMT!