[shell] shell script static checking tool shellcheck

Table of contents

Introduction

Instructions

use on the web

On the command line use

Integrate into editor (recommended)

Integration into Sublime

Command line use on windows

Error explanation

Official website description

List of Questions

Other Miscellaneous Questions


Introduction

shellcheck is a practical shell script static checking tool, which can help you find and fix simple syntax errors in advance, saving time.

Instructions

use on the web

On the webpage  https://www.shellcheck.net  , paste your script and run the check

On the command line use

yum install ShellCheck

 shellcheck     yourscript.sh

Integrate into editor (recommended)

  • Vim integration via ALE, Neomake or Syntastic
  • Emacs integration via Flycheck or Flymake
  • Sublime via SublimeLinter.
  • Atom via Linter.
  • VSCode passes vscode-shellcheck.

Integration into Sublime

sublime: install SublimeLinter -- "tool input Install -- "package install input SublimeLinter installation

Close sublime, reopen it, and open the script file.

tool -- "Enter SublimeLinter, select SublimeLinter: lint this view

Command line use on windows

After installing the exe version, you need to set the environment variable:

Settings == "system information == "advanced system settings == "(bottom) environment variable settings == "system variables -> new path to increase the path of shellcheck.exe.

Close the cmd window, reopen it, enter path, and you can see the newly added path

Enter shellcheck in cmd, there is an echo

Error explanation

Official website description

Usually the error/warning information is as follows:

$ shellcheck myscript
In myscript line 5:
eof
   ^-- SC1118: Delete whitespace after the here-doc end token.

According to the error number SC1118, just visit the corresponding web page: https://www.shellcheck.net/wiki/SC1118

If the network is not good, please refer to:

List of Questions

So what exactly will shellcheck check for? An incomplete list of checks is given below.
You can see if you can realize that there are mistakes or hidden dangers in this way of writing.
If you find that you don't know or you are easy to miss, then maybe you should also take some time to install shellcheck.

quotes problem

echo $1 # Unquoted variables #变量未加引号

find . -name *.ogg # Unquoted find/grep patterns #find/grep 的匹配模式未加引号

rm "~/my file.txt" # Quoted tilde expansion #引号中的波浪符扩展

v='--verbose="true"'; cmd $v # Literal quotes in variables # 变量中的字面引号

for f in "*.ogg" # Incorrectly quoted 'for' loops # 错误的for循环

touch $@ # Unquoted $@ # $@未加引号

echo 'Don't forget to restart!' # Singlequote closed by apostrophe # 单引号被撇号意外关闭了

echo 'Don\'t try this at home' # Attempting to escape ' in '' #试图在单引号括起来的部分中加上一个单引号

echo 'Path is $PATH' # Variables in single quotes # 将变量用单引号括起来

trap "echo Took ${SECONDS}s" 0 # Prematurely expanded trap #过早扩展陷阱

conditional judgment

ShellCheck can identify most incorrect conditional judgment statements

[[ n != 0 ]] # Constant test expressions # 常量测试表达式

[[ -e *.mpg ]] # Existence checks of globs # 对文件是否存在进行检查时,使用通配符

[[ $foo==0 ]] # Always true due to missing spaces #由于缺乏空格,结果总是为真

[[ -n "$foo " ]] # Always true due to literals #由于字面值存在,结果总是为真

[[ $foo =~ "fo+" ]] # Quoted regex in =~ # 在 =~ 中使用正则表达式

[ foo =~ re ] # Unsupported [ ] operators # 不支持的[]运算符

[ $1 -eq "shellcheck" ] # Numerical comparison of strings # 比较数字和字符串

[ $n && $m ] # && in [ .. ] # 在[]中使用&&运算符

[ grep -q foo file ] # Command without $(..) #命令缺少了$(..)

[[ "$$file" == *.jpg ]] # Comparisons that can't succeed #无法成功的比较

(( 1 -lt 2 )) # Using test operators in ((..)) #在((..))中使用比较

Common misuse of commands

ShellCheck can identify misuse of some commands

grep '*foo*' file # Globs in regex contexts #在grep的正则表达式中前后使用通配符

find . -exec foo {} && bar {} \; # Prematurely terminated find -exec # 使find -exec 过早结束

sudo echo 'Var=42' > /etc/profile # Redirecting sudo # 重定向sudo

time --format=%s sleep 10 # Passing time(1) flags to time builtin # 将time(1)的标志传递给内建的time

while read h; do ssh "$h" uptime # Commands eating while loop input # 一个获取输入的while循环中,使用同样会获取输入的命令

alias archive='mv $1 /backup' # Defining aliases with arguments # 定义使用参数的alias

tr -cd '[a-zA-Z0-9]' # [] around ranges in tr # 在tr的参数范围外使用[]

exec foo; echo "Done!" # Misused 'exec' # 错误地使用exec

find -name \*.bak -o -name \*~ -delete # Implicit precedence in find # 在find中的隐式优先级

# find . -exec foo > bar \; # Redirections in find #find中的重定向

f() { whoami; }; sudo f # External use of internal functions #在外部使用内部函数

Common mistakes made by beginners

ShellCheck identifies many beginner grammar mistakes

var = 42 # Spaces around = in assignments #等号两边的空格

$foo=42 # $ in assignments # 对变量赋值时使用了$

for $var in *; do ... # $ in for loop variables # 在循环变量处使用$

var$n="Hello" # Wrong indirect assignment #错误的变量

echo ${var$n} # Wrong indirect reference #错误的引用

var=(1, 2, 3) # Comma separated arrays #逗号分割数组

array=( [index] = value ) # Incorrect index initialization #错误的索引初始化

echo $var[14] # Missing {} in array references #引用数组缺少{}

echo "Argument 10 is $10" # Positional parameter misreference #错误的位置参数引用

if $(myfunction); then ..; fi # Wrapping commands in $() #在命令外加上$()

else if othercondition; then .. # Using 'else if' #使用else if

f; f() { echo "hello world; } # Using function before definition 在函数定义之前使用函数

[ false ] # 'false' being true # 此处false为true

if ( -f file ) # Using (..) instead of test #使用()取代测试条件

style

ShellCheck can suggest some style improvements

[[ -z $(find /tmp | grep mpg) ]] # Use grep -q instead #改成使用grep -q

a >> log; b >> log; c >> log # Use a redirection block instead #改成使用重定向块

echo "The time is `date`" # Use $() instead #改成使用$()

cd dir; process *; cd ..; # Use subshells instead #改成使用subshell

echo $[1+2] # Use standard $((..)) instead of old $[] #改成使用标准的$((..))

echo $(($RANDOM % 6)) # Don't use $ on variables in $((..)) #在$((..))中不要使用$

echo "$(date)" # Useless use of echo # 没必要的echo

cat file | grep foo # Useless use of cat #没必要的cat

Data and typos

ShellCheck can identify some data and typos

args="$@" # Assigning arrays to strings # 将数组赋值给字符串

files=(foo bar); echo "$files" # Referencing arrays as strings # 把数字当成字符串引用

declare -A arr=(foo bar) # Associative arrays without index # 不带索引组合数组

printf "%s\n" "Arguments: $@." # Concatenating strings and arrays # 连接字符串和数组

[[ $# > 2 ]] # Comparing numbers as strings # 把数字当成字符串比较

var=World; echo "Hello " var # Unused lowercase variables # 未使用的小写变量

echo "Hello $name" # Unassigned lowercase variables # 未赋值的小写变量

cmd | read bar; echo $bar # Assignments in subshells # 在subshells中进行赋值

cat foo | cp bar # Piping to commands that don't read # 通过管道传递数据给一个不会做读取的程序

printf '%s: %s\n' foo # Mismatches in printf argument count # pirintf参数数量不匹配

robustness

ShellCheck can make some suggestions to enhance the robustness of scripts

rm -rf "$STEAMROOT/"* # Catastrophic rm # 可能导致灾难性后果的rm

touch ./-l; ls * # Globs that could become options # 使用了可能变成选项的通配符

find . -exec sh -c 'a && b {}' \; # Find -exec shell injection # Find -exec shell注入

printf "Hello $name" # Variables in printf format # 在printf的格式化参数中使用变量

for f in $(ls *.txt); do # Iterating over ls output # 在ls的输出上进行迭代

export MYVAR=$(cmd) # Masked exit codes # 使退出码模糊

case $version in 2.*) :;; 2.6.*) # Shadowed case branches # 隐蔽的case分支

portability

ShellCheck warns you about using features that are not supported by the shebang.
For example, when you set shebang to  #!/bin/sh yes, ShellCheck  checkbashisms warns about similar portability problems.

 
 
echo {1..$n} # Works in ksh, but not bash/dash/sh #在 ksh 中可用,在 bash/dash/sh 中不可用

echo {1..10} # Works in ksh and bash, but not dash/sh #在 ksh 中可用,在 bash/dash/sh 中不可用

echo -n 42 # Works in ksh, bash and dash, undefined in sh #在 ksh/bash/dash 中可用,在 sh 中不可用

trap 'exit 42' sigint # Unportable signal spec # 不具有可移植性的信号细节

cmd &> file # Unportable redirection operator # 不具有可移植性的重定向操作

read foo < /dev/tcp/host/22 # Unportable intercepted files # 不具有可移植性的截获的文件

foo-bar() { ..; } # Undefined/unsupported function name # 未定义/不支持的函数名

[ $UID = 0 ] # Variable undefined in dash/sh # dash/sh 中未定义的变量

local var=value # local is undefined in sh # sh 中未定义local

time sleep 1 | sleep 5 # Undefined uses of 'time' # 使用了time未定义的用法

Other Miscellaneous Questions

ShellCheck can identify some other problems

PS1='\e[0;32m\$\e[0m ' # PS1 colors not in \[..\] # PS1 的颜色不在\[..\] 中

PATH="$PATH:~/bin" # Literal tilde in $PATH # $PATH中的波浪号

rm “file” # Unicode quotes #Unicode 引号

echo "Hello world" # Carriage return / DOS line endings # 传输返回DOS行结束符/

echo hello \ # Trailing spaces after \ # \后面的行尾空格

var=42 echo $var # Expansion of inlined environment # 展开内联环境变量

#!/bin/bash -x -e # Common shebang errors # shebang 命令错误

echo $((n/180*100)) # Unnecessary loss of precision # 不必要的精度丢失

ls *[:digit:].txt # Bad character class globs # 不好的通配符

sed 's/foo/bar/' file > file # Redirecting to input # 重定向到输入

while getopts "a" f; do case $f in "b") # Unhandled getopts flags # 未处理的getopts标志

Reference: Introduction to linux shell script static inspection tool shellcheck - whatday's blog - CSDN blog

Guess you like

Origin blog.csdn.net/bandaoyu/article/details/129938090
Recommended