ShellCheck 可以提出一些风格改进建议
[[ -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 数据和拼写错误ShellCheck 可以识别一些数据和拼写错误
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参数数量不匹配 鲁棒性ShellCheck可以做出一些增强脚本鲁棒性的建议
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分支 可移植性ShellCheck 警告你使用了 shebang 不支持的特性.。
比如,当你设置 shebang 为 #!/bin/sh 是, ShellCheck 对类似 checkbashisms 的可移植性问题发出警告。
ShellCheck 可以识别到一些其他问题
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标志 总结以上就是shellcheck的介绍了,主要来自其github 的readme ,源码在 github https://github.comf/koalaman/shellcheck