ShellCheck规范
ShellCheck是一个静态分析工具,显示有关bash / sh shell脚本中的错误代码的警告和建议。
安装
SC1010
'done' 的前面必须有分号或者换行
错误代码:
for f in *; do echo "$f" done
正确代码:
for f in *; do echo "$f"; done
SC1014
使用 'if cmd; then ..' 结构来检查返回值, 或者 'if [[ $(cmd) == .. ]]' 结构来检查输出.
错误代码:
if [ grep -q pattern file ]
then
echo "Found a match"
fi
正确代码:
if grep -q pattern file
then
echo "Found a match"
fi
SC1017
所有文件的换行符格式必须为 LF
错误代码:
$ cat -v myscript
#!/bin/sh^M
echo "Hello World"^M
正确代码:
$ cat -v myscript
#!/bin/sh
echo "Hello World"
SC1020
在单行中 "]" 前必须加上一个空格
错误代码:
if [ "$STUFF" = ""]; then
正确代码:
if [ "$STUFF" = "" ]; then
SC1029
在 " [[..]] " 结构中 不能转移 “(" 或者 " ) "
错误代码:
[[ -e ~/.bashrc -a \( -x /bin/dash -o -x /bin/ash \) ]]
正确代码:
[[ -e ~/.bashrc -a ( -x /bin/dash -o -x /bin/ash ) ]]
SC1035
控制结构的必须要有一个空格符 错误代码:
if ![-z foo ]; then true; fi # if command `[-z' w/ args `foo', `]' fails..
正确代码:
if ! [ -z foo ]; then true; fi # if command `[' w/ args `-z', `foo', `]' fails..
SC1054
结构 '{' 后必须要有一个空格符 错误代码:
foo() {echo "hello world;}
正确代码:
foo() { echo "hello world;}
SC1065
不要去定义参数,使用默认参数 例如 $1,$2.. 错误代码:
foo(input) {
echo "$input"
}
foo("hello world");
正确代码:
foo() {
echo "$1"
}
foo "hello world"
SC1068
不要在 = 的前后输入空格 错误代码:
foo = 42
正确代码:
foo=42
SC1075
使用 'elif' 代替 'else if' 结构 错误代码:
if [ "$#" -eq 0 ]
then
echo "Usage: ..."
else if [ "$#" -lt 2 ]
then
echo "Missing operand"
fi
正确代码:
if [ "$#" -eq 0 ]
then
echo "Usage: ..."
elif [ "$#" -lt 2 ]
then
echo "Missing operand"
fi
SC1086
在循环的迭代名字中不要使用 $ 符号
错误代码:
for $var in *
do
echo "$var"
done
正确代码:
for var in *
do
echo "$var"
done
SC1095
在函数名和主体之间需要一个空格或换行。
错误代码:
function foo{
echo "hello world"
}
正确代码:
function foo {
echo "hello world"
}
SC1099
在"#"符号前需要一个空格。
错误代码:
while sleep 1
do# show time
date
done
正确代码:
while sleep 1
do # show time
date
done
SC2016
在表达式里面需要使用双引号。
错误代码:
name=World
echo 'Hello $name'
正确代码:
name=World
echo "Hello $name"