BashSupport Pro支持的ShellCheck代码
这是 BashSupport Pro 支持的所有 ShellCheck 检查项。 请参考 ShellCheck 帮助手册 了解更多支持的功能。
我们的 Bash 集成开发工具 支持在编辑器中高亮显示 ShellCheck 消息, 也可以通过
# shellcheck
注释来抑制这些消息,此时会在类似
SC1000
这样的代码上显示提示信息。
请注意,这些描述信息是基于官方的
ShellCheck wiki
所生成的,因此其英文消息版权属于 ShellCheck 项目所有。
- SC1000
-
$
没有作为特殊用途,因此应被转义.
- SC1001
-
在此上下文中,
\o
将是普通的 'o'(无需转义)。
- SC1003
-
要转义单引号? 请使用
echo 'This is how it'\''s done'
。
- SC1004
- 此反斜杠+换行符是文字。如果您想断行,应在单引号外断行。
- SC1007
-
如果要赋值,请移除
=
后的空格(对于空字符串,请使用var=''
...)。
- SC1008
- 此 shebang 未被识别。ShellCheck 仅支持 sh/bash/dash/ksh。请添加 'shell' 指令来指定。
- SC1009
- 提到的解析错误位于...
- SC1010
-
在
done
前使用分号或换行符(或加引号使其为文字)。
- SC1011
- 这个撇号终止了单引号字符串!
- SC1012
-
此处仅为文字
t
。要添加制表符,请改用"$(printf '\t')"
。
-
SC1014
-
使用
if 命令; then ..
检查退出代码,或使用if [ "$(命令)" = .. ]
检查输出。
-
SC1015
-
这是 Unicode 双引号。将其删除并重新输入。
-
SC1016
-
这是 Unicode 单引号。将其删除并重新输入。
-
SC1017
-
文字回车。通过
tr -d '\r'
运行脚本。
-
SC1018
-
这是 Unicode 的不间断空格。将其删除并使用空格键重新输入。
-
SC1019
-
此处应是一元条件的参数。
-
SC1020
-
应在
]
或]]
前面添加空格
-
SC1026
-
如果对
[[..]]
内部的表达式分组,请使用( .. )
。
-
SC1027
-
此操作符需要另外一个参数。
-
SC1028
-
在
[..]
中需要转义\( \)
或优先结合[..]
表达式。
-
SC1029
-
在
[[..]]
中不应转义(
或)
。
-
SC1033
-
测试表达式使用双
[[
开始但却使用单个]
闭合。请确保它们能匹配。
-
SC1034
-
测试表达式使用双
[
开始但却使用单个]]
闭合。请确保它们能匹配。
-
SC1035
-
在此处添加空格
-
SC1036
-
(
在此处无效。您是否忘记将其转义?
-
SC1037
-
大于 9 (例如
${10}
)的位置参数需要大括号。
-
SC1038
-
Shell 是空格敏感的。使用
< <(命令)
而非<<(命令)
。
-
SC1039
-
移除结束标记前的缩进(或使用
<<-
并以制表符缩进)。
-
SC1040
-
使用
<<-
时,只能使用制表符缩进。
-
SC1041
-
在更下方找到
eof
,但不在单独的一行上。
-
SC1042
-
请关闭包含
-eof
(!=eof
)的匹配。
-
SC1043
-
在更远处发现了EOF,但是大小写不正确。
-
SC1044
-
在 here 文档中找不到结束标记
EOF
。
-
SC1045
-
foo &; bar
中的分号多余,应为foo & bar
。
-
SC1046
-
找不到此
if
对应的fi
。
-
SC1047
-
fi
应匹配先前提及的if
。
-
SC1048
-
不能有空then子句(使用
true
作为无操作)。
-
SC1049
-
您是否忘记了为这个
if
指定then
?
-
SC1050
-
应为
then
。
-
SC1051
-
请勿在
then
后面直接使用分号。请删掉它。
-
SC1052
-
请勿在
then
后面直接使用分号。请删掉它。
-
SC1053
-
请勿在
else
后面直接使用分号。请删掉它。
-
SC1054
-
请在
{
后面添加空格。
-
SC1055
-
这里需要至少有一条命令。使用
true;
来不进行任何操作.
-
SC1056
-
此处应为
}
。如果已经存在,请尝试在前面插入;
或者\n
。
-
SC1057
-
你是否在此循环中忘记了写
do
?
-
SC1058
-
此处应为
do
。
-
SC1059
-
do
后面不允许直接跟随分号。你可以直接删除它。
-
SC1060
-
无法使用空的do语句(使用
true
实现空操作)
-
SC1061
-
找不到此
do
的done
。
-
SC1062
-
done
应匹配先前提及的do
。
-
SC1063
-
do
语句之前需要一个换行符或者分号。
-
SC1064
-
应使用
{
来开启函数定义。
-
SC1065
-
尝试声明参数?不能这么做。请使用
()
,并将参数引用为$1
或$2
..
-
SC1066
-
请勿在赋值的左侧使用
$
。
-
SC1067
-
非直接引用,请使用数组,
定义 "var$n=value"
, 或者(在sh中)使用read
或eval
-
SC1068
-
请勿在赋值中的
=
周围放置空格。
-
SC1069
-
请在
[
前面添加空格。
-
SC1070
-
解析在此处终止。关键字不匹配或者圆括号无效?
-
SC1071
-
ShellCheck 仅支持 sh/bash/dash/ksh 脚本。很抱歉!
-
SC1072
-
意外 ..
-
SC1073
-
无法解析这里(项)。请修正以允许继续进行更多检查。
-
SC1074
-
您是否忘记了在之前的case 项目后面添加
;;
?
-
SC1075
-
使用
elif
而非else if
。
-
SC1076
-
尝试用数学?使用例如这样的代码:
[ $((i/2+7)) -ge 18 ]
。
-
SC1077
-
对于命令扩展,请使用反引号: (
`
对应´
)。
-
SC1078
-
您是否忘记了关闭双引号字符串?
-
SC1079
-
这是右引号结束符,但是由于下一个字符的缘故,它看起来很可疑。
-
SC1080
-
你需要在换行之前使用
\
来断开行[ ]
。
-
SC1081
-
脚本区分大小写。请使用
if
,而不是If
。
-
SC1082
-
此文件具有 UTF-8 BOM。请使用此命令将其移除
LC_CTYPE=C sed '1s/^...//' < 您的脚本文件
。
-
SC1083
-
此
{
/}
为文字。检查表达式是否缺少;
或使用引号将其括起来。
-
SC1084
-
在 shebang 中请使用
#!
, 而非!#
。
-
SC1086
-
请不要在 for 循环的迭代器名称中使用
$
。
-
SC1087
-
展开数组时请使用大括号,例如:
${array[idx]}
(或${var}[..
以静默)。
-
SC1088
-
解析在此处终止。是否括号使用无效?
-
SC1089
-
解析在此处终止。此关键字是否正确匹配?
-
SC1090
-
无法追踪非常量源。请使用指令指定位置。
-
SC1091
-
未遵循:(此消息为报错信息)
-
SC1092
-
在100
源代码
帧停止 :O
-
SC1094
-
解析源文件失败。忽略。
-
SC1095
-
您需要在函数名称和函数体之间插入空格或换行符。
-
SC1097
-
意外
==
。对于赋值语句,请使用=
。对于比较,请使用[
或[[
。
-
SC1098
-
使用
eval
时,请使用引号或转义特殊字符,例如:eval "a=(b)"
。
-
SC1099
-
请在
#
前面添加空格。
-
SC1100
-
这是 Unicode 短划线。请删除并重新输入为 ASCII 减号字符(英文半角)。
-
SC1101
-
请删除
\
后面的尾随空格以断行(或用引号表示空格字符)。
-
SC1102
-
Shell 以不同方式消除
$((
歧义或根本不消除歧义。对$(命令替换)
,在$(
后面添加空格。对$((算数))
,修复解析错误。
-
SC1103
-
shell类型不可识别。请使用例如
sh
或bash
。
-
SC1104
-
在 shebang 中请使用
!#
,而非只有!
。
-
SC1105
-
Shell 以不同方式消除
((
歧义或根本不消除歧义。如果首个(
应开始 subshell,请在其后添加空格。
-
SC1106
-
在算数上下文中,请使用
<
来代替-lt
-
SC1107
-
该指令未知。它将被忽略。
-
SC1108
-
请在
=
前后添加空格。
-
SC1109
-
这是未加引号的 HTML 实体。请替换为对应的字符。
-
SC1110
-
这是 Unicode 引号。删除并重新输入英文半角引号(或加引号使其为文字)。
-
SC1111
-
这是 Unicode 引号。删除并重新输入英文半角引号(或者忽略/加单引号使其为文字)。
-
SC1112
-
这是 Unicode 引号。删除并重新输入英文半角引号(或者忽略/加双引号使其为文字)。
-
SC1113
-
在 shebang 中请使用
#!
,而非只有#
。
-
SC1114
-
请移除 shebang 前面的前导空格。
-
SC1115
-
请在 shebang 中移除
#
和!
之间的空格。
-
SC1116
-
$((..))
表达式中缺少$
?(如果是数组,请使用( (
)。
-
SC1117
-
反斜杠为
"\n"
中的文字。首选显式转义:"\\n"
。
-
SC1118
-
请删除 here 文档结束标记后的空格。
-
SC1119
-
在结束标记和终止
)
之间添加换行符。
-
SC1120
-
here 文档标记后面不允许注释。请改为注释下一行。
-
SC1121
-
在含有
<<
的行中添加;
/&
终止符(和其他语法),而不是在这里添加。
-
SC1122
-
结束标记后面不允许有任何内容。要继续一条命令,请将其放在包含
<<
的行中。
-
SC1123
-
ShellCheck 指令仅在
if
等完整复合命令(而非例如单个elif
分支)前有效。
-
SC1124
-
ShellCheck 指令仅在完整命令如
case
语句前有效,而非单个 case 分支。
-
SC1125
-
指令中的
键=值
对无效
-
SC1126
-
请将 ShellCheck 指令放在命令前面,而不是后面。
-
SC1127
-
您是想要创建注释吗?请在 sh 中使用
#
。
-
SC1128
-
shebang 必须在第一行。请删除空格并移动注释。
-
SC1129
-
请在
!
前面添加空格。
-
SC1130
-
请在
:
前面添加空格。
-
SC1131
-
请使用
elif
来开始另一分支。
-
SC1132
-
此
&
会终止命令。请将其转义或在&
后面添加空格以静默。
-
SC1133
-
意外的新行首。如需断行,
|
,||
或者&&
应放在上一行的末尾。
-
SC1134
-
无法解析
shellcheckrc
:
-
SC1135
-
请转义结尾的引号以使
$
成为文字。请使用"It costs \$5"
来代替"It costs $"5
-
SC1136
-
在结束的
]
后面有意外字符。缺少分号或换行符?
-
SC1137
-
for ((;;)) 循环中无法开始算术,缺少第二个
(
-
SC1138
-
Shell对空格敏感。请使用
< <(cmd)
,不能用<< (cmd)
。
-
SC1139
-
请在测试命令之间使用
||
代替-o
。
-
SC1140
-
条件之后出现意外的参数。缺少
&&
,||
或者表达式错误?
-
SC1141
-
在复合命令后意外出现标识。重定向错误或者缺少
;
,&&
,||
或者|
?
-
SC1142
-
使用
done < <(cmd)
来从进程替换(现在缺少一个<
)。
-
SC1143
-
此反斜杠是注释的一部分,因此不会继续当前行。
-
SC1144
-
外部-源代码
只能在 .shellcheckrc 中启用,不能在单个文件中用。
-
SC1145
-
未知的
外部-源代码
值。需要true
/false
。
-
SC2000
-
请确认是否可改用
${#variable}
-
SC2001
-
请确认是否可改用
${variable//search/replace}
。
-
SC2002
-
冗余的 cat。可以考虑改用
cmd < file | ..
或cmd file | ..
。
-
SC2003
-
expr 已过时。可使用
$((..))
,${}
或[[ ]]
进行重写。
-
SC2004
-
$
和${}
在算术变量上非必要。
-
SC2005
-
冗余的
echo
?不要使用echo $(cmd)
,而是使用cmd
-
SC2006
-
不使用旧版的反引号
`...`
,请使用$(...)
表示法代替。
-
SC2007
-
请使用
$((..))
代替废弃的$[..]
。
-
SC2008
-
echo
不从 stdin 读取,您确定您仍要通过管道来通向它?
-
SC2009
-
SC2009 考虑使用
pgrep
代替 grepps
输出。
-
SC2010
-
不要使用
ls | grep
。请使用 glob 或条件 for 循环来允许使用非字母数字文件名。
-
SC2011
-
使用
find -print0
或find -exec
来更好的处理非字母数字文件名。
-
SC2012
-
使用
find
来代替ls
来更好地处理非字母数字文件名。
-
SC2013
-
要读取行而不是单词,应通过管道通向或重定向输出到
while read
循环。
-
SC2014
-
这将在 find 运行之前仅展开一次,而不是对每个找到的文件展开一次。
-
SC2015
-
注意,
A && B || C
并非 if-then-else 。A 为 true 时 C 可能会运行。
-
SC2016
-
表达式不应用单引号展开,请使用双引号。
-
SC2017
-
将
a/b*c
替换为a*c/b
以提高精度。
-
SC2018
-
使用
[:lower:]
支持重音和外来字母。
-
SC2019
-
使用
[:upper:]
支持重音和外来字母。
-
SC2020
-
tr
替换字符集合,而非单词(由于重复而提及)。
-
SC2021
-
不要在
tr
范围内使用[]
,它会替换文字方括号。
-
SC2022
-
注意与 glob 不同 ,
o*
在此处匹配ooo
而非oscar
。
-
SC2023
-
shell可能覆盖在man time(1)中看到的
time
。请使用command time ..
来代替。
-
SC2024
-
sudo
不影响重定向。使用..| sudo tee file
-
SC2025
-
确保所有转义序列都被
\[..\]
封闭以防止出现换行问题。
-
SC2026
-
这个词在引号之外。您是想
'嵌入 '"'单引号'"'
代替' 吗?
-
SC2027
-
包围的引号实际取消了引号。将其移除或转义。
-
SC2028
-
echo
不会展开转义序列。请考虑使用printf
。
-
SC2029
-
注意如果未转义,将在客户端展开。
-
SC2030
-
var 的修改是局部的(通过管道引起的 subshell)。
-
SC2031
-
在 subshell 中对 var 进行了修改。这种变更可能会丢失。
-
SC2032
-
使用您自己的脚本或
sh -c '..'
从su
运行。
-
SC2033
-
Shell 函数不能传递给外部命令。请使用单独的脚本或者 sh -c。
-
SC2034
-
foo 似乎未使用。对其进行验证或导出。
-
SC2035
-
使用
./\*glob*
或-- \*glob*
,以使带短划线的名称不会变成选项。
-
SC2036
-
如果您想赋值管道的输出,请使用
a=$(b | c)
。
-
SC2037
-
要赋值命令的输出,请使用
var=$(cmd)
。
-
SC2038
-
使用
-print0
,-0
或find -exec +
,以允许使用非字母数字文件名。
-
SC2039
-
在 POSIX sh 中,某些 *写法* 尚不支持。
-
SC2040
-
已指定
!/bin/sh
,因此即使 sh 实际上是 bash 也不会支持 ____。
-
SC2041
-
这是文字字符串。要想作为命令运行,请使用
$(..)
代替使用'..'
。
-
SC2042
-
请使用空格而非分号来隔开循环元素。
-
SC2043
-
此循环只对一个常量值运行一次。您是否想对
dir/*
,$var
或$(cmd)
进行循环?
-
SC2044
-
在 find 输出上进行 for 循环会比较脆弱。请使用
find -exec
或while read
循环。
-
SC2045
-
在 ls 输出上进行迭代会比较脆弱。请使用 glob。
-
SC2046
-
使用引号将其引起来,以防止单词分割 。
-
SC2048
-
使用
"$@"
(带引号)避免产生空格问题。
-
SC2049
-
=~
用于正则表达式,但这看起来像 glob。请改用=
。
-
SC2050
-
此表达式为常量。您是否遗忘了变量上的
$
?
-
SC2051
-
Bash 在大括号范围展开中不支持变量。
-
SC2053
-
在
[[ ]]
中为=
右侧的元素加引号以防止 glob 匹配。
-
SC2054
-
请使用空格代替分号来隔开数组元素。
-
SC2055
-
您可能需要在此使用
&&
,否则它会一直返回 true。
-
SC2056
-
您可能需要在此使用
&&
-
SC2057
-
未知的二元操作符。
-
SC2058
-
未知的一元操作符。
-
SC2059
-
不要在
printf
格式字符串中使用变量。请使用如下语法:printf "..%s.." "$foo"
。
-
SC2060
-
为 tr 的参数加引号来防止 glob 展开。
-
SC2061
-
为
-name
的参数加引号,这样 shell 就不会解释它。
-
SC2062
-
为 grep 模式加引号,这样 shell 就不会解释它。
-
SC2063
-
Grep 使用正则表达式,但这看起来像是 glob。
-
SC2064
-
请使用单引号,这样仅在发出信号时才展开,而不是立即展开。
-
SC2065
-
这将被解释为 shell 文件重定向,而非比较。
-
SC2066
-
由于您用双引号将其引起,因此不会分割单词,因此循环将只运行一次。
-
SC2067
-
缺少
;
或+
将终结-exec
。请不要使用|
,||
或&&
,并使用引号将;
引起作为单独参数。
-
SC2068
-
用双引号引起数组扩展以避免重新分割元素。
-
SC2069
-
要想重定向stdout+stderr,
2>&1
必须放置在末尾(或者使用{ cmd > file; } 2>&1
来明确含义)。
-
SC2070
-
-n
不能与未加引号的参数共同工作。请加引号或使用[[ ]]
。
-
SC2071
-
>
被用于字符串比较。请使用-gt
代替。
-
SC2072
-
不支持小数。请仅使用整数,或者使用
bc
或awk
来进行比较。
-
SC2073
-
请转义
\<
以避免它产生重定向(或切换为[[ .. ]]
)。
-
SC2074
-
无法在
[ ]
中使用=~
。请使用[[..]]
来代替。
-
SC2075
-
在代码
[..]
中需要转义\<
,但是在[[..]]
中无效
-
SC2076
-
请不要为
=~
右侧的元素加引号,它会按文字匹配而不是作为正则表达式匹配。
-
SC2077
-
比较运算符前后需要使用空格围起。
-
SC2078
-
此表达式为常量。您是否在某些地方忘了加
$
?
-
SC2079
-
(( ))
不支持小数,请使用bc
或awk
。
-
SC2080
-
使用0开头的数字降为被处理八进制数字。
-
SC2081
-
[ .. ]
无法匹配 glob。请使用[[ .. ]]
或者 grep。
-
SC2082
-
要想使用间接展开,请使用
name="foo$n"; echo "${!name}"
。
-
SC2083
-
在
./file
的斜线后面不要添加空格。
-
SC2084
-
去掉
$
或者_=$((expr))
来避免执行输出。
-
SC2086
-
请使用双引号来避免 glob 和单词分割。
-
SC2087
-
使用引号括起来
EOF
来使 here 文档的展开发生在服务器端而不是发生在客户端。
-
SC2088
-
引号中的波浪符号不会被展开。请使用
$HOME
。
-
SC2089
-
引号/反斜线将会被处理为文字。请使用数组。
-
SC2090
-
此变量中的引号/反斜线不会被处理。
-
SC2091
-
请移除包围的
$()
来避免执行输出(或者使用eval
达到预期)。
-
SC2092
-
移除反斜线来避免执行输出。
-
SC2093
-
如果希望此命令后脚本继续进行,请删除
exec
。
-
SC2094
-
请确保不要在相同的管道中读取和写入同一文件。
-
SC2095
-
使用
ssh -n
来避免 ssh 吞下 stdin。
-
SC2096
-
在大多数操作系统中,shebang 只能指定单个参数。
-
SC2097
-
此赋值仅能被复刻的进程看到。
-
SC2098
-
此展开将无法看到提到的赋值。
-
SC2099
-
使用
$((..))
来进行数字运算,例如i=$((i + 2))
-
SC2100
-
使用
$((..))
来进行数字运算,例如i=$((i + 2))
-
SC2101
-
被命名的类外部需要包裹
[]
, 例如[[:digit:]]
。
-
SC2102
-
范围只能匹配单个字符(会因为重复提及)。
-
SC2103
-
使用
( subshell )
来避免必须cd
回来。
-
SC2104
-
在函数中,请使用
return
来代替break
。
-
SC2105
-
break
仅在循环语句中才有效
-
SC2106
-
这只会存在于被管道产生的 subshell 中。
-
SC2107
-
请不要使用
[ a && b ]
,应使用[ a ] && [ b ]
。
-
SC2108
-
在
[[..]]
中,请使用&&
代替-a
。
-
SC2109
-
请不要使用
[ a || b ]
,应使用[ a ] || [ b ]
。
-
SC2110
-
在
[[..]]
中,请使用||
代替-o
。
-
SC2111
-
ksh不允许
function
关键字和()
同时存在。
-
SC2112
-
function
关键字不是标准。请删除它。
-
SC2113
-
function
关键字不是标准。请使用foo()
代替function foo
。
-
SC2114
-
警告:删除系统文件目录。
-
SC2115
-
使用
"${var:?}"
来确保永不会展开到/*
。
-
SC2116
-
无用的 echo?请勿使用
cmd $(echo foo)
,仅使用cmd foo
即可。
-
SC2117
-
要想使用另一个用户来运行命令,请使用
su -c
或者sudo
。
-
SC2118
-
Ksh不支持
|&
。请使用2>&1 |
-
SC2119
-
如果函数的参数
$1
应等于脚本的$1
,请使用代码foo "$@"
。
-
SC2120
-
foo 引用了参数,但是没有一个参数被传递进来。
-
SC2121
-
要想给变量赋值,请使用
var=value
,而不是用set ..
。
-
SC2122
-
>=
并非有效操作符。请使用! a < b
来代替。
-
SC2123
-
PATH
是被 shell 所使用的搜索路径。请另外选一个名字。
-
SC2124
-
试图给字符串赋值一个数组!请给数组赋值,或者使用
*
代替@
来进行连接操作。
-
SC2125
-
在赋值语句中,花括号展开和 glob 会被当做文字。请使用引号引起或者使用数组。
-
SC2126
-
请考虑使用
grep -c
来代替grep | wc
-
SC2127
-
要想使用
${ ..; }
,请在#!/usr/bin/env ksh
中指定。
-
SC2128
-
展开一个数组但不提供索引,将只能得到第一个元素。
-
SC2129
-
考虑使用
{ cmd1; cmd2; } >> file
来代替多个单重定向语句。
-
SC2130
-
-eq
仅用来进行整数比较。请使用=
来代替(比较字符串)。
-
SC2139
-
这种展开只能在定义的时候进行,而非使用的时候进行展开。请考虑使用转义。
-
SC2140
-
单词格式为
"A"B"C"
(B 作为其中明确定义的词). 您是否想要使用"ABC"
或者"A\\"B\\"C"
?
-
SC2141
-
您是否想要表达
IFS=$'\t'
?
-
SC2142
-
别名不能使用位置参数。请使用函数。
-
SC2143
-
请使用
grep -q
代替使用[ -n .. ]
进行输出比较。
-
SC2144
-
-e
不能和 glob 一起工作。请使用for
循环。
-
SC2145
-
参数中混合了字符串和数组。请使用
*
或者独立的参数。
-
SC2146
-
此动作会忽略
-o
前面的任何内容。请使用\( \)
进行分组。
-
SC2147
-
PATH 中的~在不同程序中工作起来效果很差(不一致)。
-
SC2148
-
提示信息依赖于目标 shell 但是您的 shell 类型未知。请添加 shebang。
-
SC2149
-
请在数字下标中删除
$
,${}
,或者转义为字符。
-
SC2150
-
-exec
不会自动调用 shell。请使用-exec sh -c ..
来达到此目的。
-
SC2151
-
只能返回唯一的 0 到 255 之间的整数。使用 stdout(标准输出)来返回其他数据。
-
SC2152
-
只能返回 0 到 255 之间的整数. 其他数据应该写入到stdout(标准输出)。
-
SC2153
-
可能存在拼写错误:MYVARIABLE 有可能无法赋值。您是想要用 MY_VARIABLE 吗?
-
SC2154
-
var 被引用了,但从未被赋值。
-
SC2155
-
将声明和赋值分开以避免覆盖返回值。
-
SC2156
-
注入文件名即容易出问题又不安全。请使用参数。
-
SC2157
-
由于内容是文字字符串,因此推断
-n
总是会返回真。
-
SC2158
-
[ false ]
的结果是真。请删除中括号
-
SC2159
-
[ 0 ]
的结果是真。请使用false
来代替。
-
SC2160
-
请勿使用
[ true ]
,使用true
即可。
-
SC2161
-
请勿使用
[ 1 ]
,使用true
即可。
-
SC2162
-
read
不结合-r
使用会干扰反斜线。
-
SC2163
-
这将不会导出
FOO
。请删除$
,${}
,或者使用${var?}
来静默。
-
SC2164
-
如果
cd
失败,请使用cd ... || exit
来代替。
-
SC2165
-
此嵌套循环内部会覆盖父循环中的索引变量。
-
SC2166
-
请使用
[ p ] && [ q ]
,因为[ p -a q ]
的定义不明确,结果不确定。
-
SC2167
-
此父循环的索引变量已经被覆盖。
-
SC2168
-
local
只在函数中才有效。
-
SC2169
-
dash目前尚不支持您的 *某些写法* 。
-
SC2170
-
-eq
比较的数字无效。请使用=
来作为字符串比较(或者使用$var
扩展为变量)。
-
SC2171
-
在条件测试末尾出现
]
。添加缺少的[
或者有意将其用引号引起来。
-
SC2172
-
使用数字直接捕获陷阱信号的含义不明确。请优先使用信号名字。
-
SC2173
-
SIGKILL/SIGSTOP 无法被捕获。
-
SC2174
-
当与
-p
一起使用时,-m
仅能应用于最深级别的目录。
-
SC2175
-
将此无效的花括号扩展用引号引起,因为 eval 只能操作传递进去的文字信息
-
SC2176
-
time
未对管道定义。请 time 单个命令或者使用bash -c
来代替。
-
SC2177
-
time
未对组合命令定义。请使用time bash -c
来代替。
-
SC2178
-
变量被当做数组使用,但是却给赋值了一个字符串。
-
SC2179
-
使用
array+=("item")
来添加元素到数组中。
-
SC2180
-
Bash 不支持多维数组。请使用一维数组或者关联数组。
-
SC2181
-
请使用例如
if mycmd;
直接检查退出码,而非间接的使用$?
。
-
SC2182
-
printf 格式化字符串中没有变量。其它参数会被忽略。
-
SC2183
-
此格式化字符串包含了两个变量,但是却只传过来一个参数。
-
SC2184
-
将 unset 的参数引起来,这样它们就不会被 glob 展开。
-
SC2185
-
某些 finds 没有默认路径。请显式指定
.
。
-
SC2186
-
tempfile 已被废弃。请使用 mktemp 。
-
SC2187
-
Ash 脚本将会被作为 Dash 检察。添加
# shellcheck shell=dash
来静默。
-
SC2188
-
此重定向中没有命令。将其移动到对应的命令处(或者使用
true
来作为无操作)。
-
SC2189
-
您不能在这个重定向和它要应用的命令中间放置
|
符号。
-
SC2190
-
关联数组中的元素需要索引键,例如:
array=( [index]=value )
。
-
SC2191
-
这里的
=
是文字。要想给索引赋值,请使用不带空格的( [index]=value )
。要想保留为文字,请用引号引起。
-
SC2192
-
此数组元素没有值。请删除
=
号后面的空格或者使用""
来表示空字符。
-
SC2193
-
此比较中的参数永远不会相同。请确保您的语法正确无误。
-
SC2194
-
此单词是常量。您是否忘了变量前面的
$
?
-
SC2195
-
这个模式永不会匹配 case 表达式中的单词。请再次检察。
-
SC2196
-
egrep
是非标准的且已被废弃。请使用grep -E
来代替。
-
SC2197
-
fgrep
是非标准的且已被废弃。请使用grep -F
来代替。
-
SC2198
-
数组
[ ]
中的运算对象无法工作。请使用循环(或者使用*
代替@
来进行连接)。
-
SC2199
-
数组
[[ ]]
中会隐式的执行连接操作。请使用循环(或者使用*
代替@
来进行连接)。
-
SC2200
-
[ ]
中的花括号展开不能工作。请使用循环。
-
SC2201
-
[[ ]]
中的花括号展开不会发生。请使用循环。
-
SC2202
-
[ ]
中的 glob 不能工作。请使用循环。
-
SC2203
-
[[ ]]
中的 glob 被忽略了,除非放在=
,!=
右侧。请使用循环。
-
SC2204
-
(..)
是 subshell。您是指[ .. ]
,一个测试表达式吗?
-
SC2205
-
(..)
是 subshell。您是指[ .. ]
,一个测试表达式吗?
-
SC2206
-
使用引号来阻止单词分割或glob,或者用更健壮的分割方式:mapfile 或
read -a
。
-
SC2207
-
首选
mapfile
或者read -a
来分割命令输出(或者使用引号来避免分割)。
-
SC2208
-
使用
[[ ]]
或者引号来避免-v
参数发生 glob 展开。
-
SC2209
-
使用
var=$(command)
来给输出赋值(或者引号来赋值为字符串)。
-
SC2210
-
这是一个文件重定向。是否是一个比较或者 fd 操作?
-
SC2211
-
这是一个作为命令名称的 glob 。您是否期望它是
${..}
,数组,或者缺少了引号包围?
-
SC2212
-
使用
false
来代替空的[
或[[
条件语句。
-
SC2213
-
getopts 指定了
-n
,但是没有被这里的case
语句来处理。
-
SC2214
-
此 case 语句没有在 getopts 中指定。
-
SC2215
-
这个标记被用作了命令名。换行错误或者忘记了
[ .. ]
?
-
SC2216
-
管道重定向到
rm
,一个不读取标准输入 stdin 的命令。 用错命令了还是忘记了xargs
?
-
SC2217
-
管道重定向到
echo
,一个不读取标准输入 stdin 的命令。引号用错了还是忘记了xargs
?
-
SC2218
-
此函数定义位置在后面(调用处之后)。请将定义上移(到调用处之前)。
-
SC2219
-
请使用
(( expr ))
来代替let expr
。
-
SC2220
-
无效标记未被处理。请添加一个
*)
case 语句。
-
SC2221
-
此规则一直会覆盖后面的那个。
-
SC2222
-
因为上一个规则,此规则决不会匹配上。
-
SC2223
-
默认赋值可能会因为 glob 而导致Dos(拒绝服务)。请用引号引起。
-
SC2224
-
mv
命令没有跟随目标。请检查参数。
-
SC2225
-
cp
命令没有跟随目标。请检查参数。
-
SC2226
-
ln
命令没有跟随目标。请检查参数,或显式的指定.
。
-
SC2227
-
重定向应用到了 find 命令自身上。重写来对每个操作进行工作(或者移动到末尾)。
-
SC2229
-
这里并未读取
foo
。删除前置的$
,${}
,或者使用${var?}
来静默。
-
SC2230
-
which
不是标准命令。请使用内置的command -v
代替。
-
SC2231
-
将
for
循环中的 glob 扩展引起来以避免单词分割,例如"$dir"/*.txt
。
-
SC2232
-
无法将
sudo
和内置命令如cd
一起使用。您是否想用sudo sh -c ..
代替?
-
SC2233
-
删除条件语句周围的
(..)
来避免 subshell 开销。
-
SC2234
-
删除测试命令周围的
(..)
来避免 subshell 开销。
-
SC2235
-
请使用
{ ..; }
代替(..)
来避免 subshell 开销。
-
SC2236
-
请使用
-n
代替! -z
。
-
SC2237
-
请使用
[ -n .. ]
代替! [ -z .. ]
。
-
SC2238
-
请从命令名重定向自或者重定向到而不是对文件。您是否想要 管道/xargs(或者加引号来忽略)?
-
SC2239
-
请确保 shebang 中使用的是解释器的绝对路径。
-
SC2240
-
sh/dash中的 点(.)命令不支持参数。请将它们设置为变量。
-
SC2241
-
退出状态码只能是 0 到 255 之间的某个整数。其它数据应该写入到stdout(标准输出)。
-
SC2242
-
只能退出状态码 0 到 255。其它数据应该写入到stdout(标准输出)或者 stderr(错误输出)。
-
SC2243
-
首选使用
-n
来检察输出(或者不包含[
、[[
来运行命令以检查执行成功)
-
SC2244
-
首选使用
-n
来检察输出非空字符串(或用=
,-ne
来检察布尔值或整数)。
-
SC2245
-
-d 仅会应用到当前 glob 中的第一个展开。使用循环来检察任一个或者全部。
-
SC2246
-
当前 shebang 指定了一个目录。请确保解释器是一个文件。
-
SC2247
-
如果要作为引号代替,请交换开头的
$
和"
。
-
SC2248
-
当变量名未包含任何特殊字符时使用双引号。
-
SC2249
-
请考虑添加默认的
*)
case,即使它只是因为错误退出。
-
SC2250
-
即使没有严格的要求,也应优先给变量引用周围添加括号。
-
SC2251
-
此处的
!
并非一个条件判断而是会跳过 errexit。请使用&& exit 1
来代替,或者确保$?
已被检查。
-
SC2252
-
您可能需要在此处添加
&&
,否则它将一直是真。
-
SC2253
-
使用
-R
以递归,或者显式的使用a-r
来删除读权限。
-
SC2254
-
请使用引号扩展来进行文字匹配而非 glob。
-
SC2255
-
[ ]
不能用于算术运算。使用$((..))
来计算数字,或者使用字符串比较符来比较字符串。
-
SC2256
-
变量名是一个翻译后的字符串。如果要作为引号代替,请交换开头的
$
和"
。
-
SC2257
-
命令重定向中的数学修改可能会被丢弃。请在单独的步骤中执行。
-
SC2259
-
此重定向覆盖了输入管道。要想两个都生效,请合并或者传递文件名。
-
SC2260
-
此重定向覆盖了输出管道。 使用
tee
来同时输出。
-
SC2261
-
多个重定向产生了竞争标准输出。请使用
cat
,tee
或者传递文件名来代替。
-
SC2262
-
别名不能在同一个解析单元中定义和使用。请使用函数来代替。
-
SC2263
-
因为它们位于同一个解析单一,此命令不会引用到之前提到的别名。
-
SC2264
-
此函数无条件的重复调用自身(死循环调用)。遗漏了
command
?
-
SC2265
-
请使用&& 来实现逻辑与。单个&将会后置并返回true。
-
SC2266
-
请使用&& 来实现逻辑与。单个&将会后置并返回true。
-
SC2267
-
GNU
xargs -i
已废弃,请使用-I{}
-
SC2268
-
避免在比较中使用 x- 前缀因为它已不会有任何用处。
-
SC2269
-
自变量被赋值给了自身,因此赋值将不会产生任何效果。
-
SC2270
-
要想给位置参数赋值,请使用
set -- first second ..
(或者使用[ ]
以进行比较)。
-
SC2271
-
对于间接访问,请使用数组,
declare "var$n=value"
或者(对于 sh 脚本)使用 read/eval
-
SC2272
-
命令名称包含
==
。如要进行比较操作,请使用[ "$var" = 值 ]
。
-
SC2273
-
发现
===
序列。代码合并冲突或者是想用来表示注释分界?
-
SC2274
-
命令名以
===
开始。想用来表示注释分界?
-
SC2275
-
命令名以
=
开始。换行错误?
-
SC2276
-
这将被解释为包含
=
的命令名。赋值错误或者想要进行比较?
-
SC2277
-
在 bash 中使用
BASH_ARGV0
来给$0
赋值(或者使用[ ]
进行比较)。
-
SC2278
-
$0
无法在 Ksh 中被赋值(但是它的确映射为当前的函数名)。
-
SC2279
-
$0
无法在 Dash 中被赋值。这将变成一个命令名。
-
SC2280
-
$0
无法使用此方式赋值,而且当前尚无其它通用的替代方式。
-
SC2281
-
请不要在赋值语句左侧使用
$
或者${}
。
-
SC2282
-
变量名不能使用数字开始,这将被解释为命令。
-
SC2283
-
使用
[ ]
来比较值,或者删除=
号周围的空格来进行赋值(或者引起'='
来表示文字)。
-
SC2284
-
使用
[ x = y ]
来比较值(或者引起'='
来表示文字)。
-
SC2285
-
删除
+=
号周围的空格来进行赋值(或者引起'+='
来表示文字)。
-
SC2286
-
此空字符串被解释为了命令名。请再次检查语法(或使用
true
作为无操作)。
-
SC2287
-
这将被解释为以
'/'
结尾的命令名。请再次检查语法。
-
SC2288
-
这将被解释为以逗号结尾的命令名。请再次检查语法。
-
SC2289
-
这将被解释为包含换行符的命令名。请再次检查语法。
-
SC2290
-
删除
=
号周围的空格来进行赋值。
-
SC2291
-
请将重复的空格引起以避免彼此折叠成为单个空格。
-
SC2292
-
在 Bash 或 Ksh 中首选使用
[[ ]]
代替[ ]
进行测试。
-
SC2293
-
当对 @Q-引起的词语进行求值时,请使用
*
来代替@
作为索引。
-
SC2294
-
eval 语句的劣势抵消掉了数组的优势。去掉 eval 来保留空格或符号(或者作为字符串来进行 eval)。
-
SC2295
-
在
${..}
中进行展开需要单独进行引起,否则它们会被作为模式比较。
-
SC2296
-
参数展开不能以
{
开始。请再次检查语法。
-
SC2297
-
双引号必须放在外面,
${}
:${"invalid"}
对应"${valid}"
。
-
SC2298
-
${$x}
无效。对展开操作,请使用 ${x}。对间接引用,请使用数组,${!x} 或(对于 sh 脚本)使用 eval。
-
SC2299
-
参数展开不能内嵌。 请使用临时变量。
-
SC2300
-
参数展开不能用来进行命令替换。请使用临时变量。
-
SC2301
-
参数展开以意外的引号开始。请再次检查语法。
-
SC2302
-
在值上循环。要想在键上循环,请使用
"${!array[@]}"
。
-
SC2303
-
i
是一个数组值,不是一个主键。请直接使用或者在键上循环来代替。
-
SC2304
-
*
必须转义以进行乘法:\*
。现代的$((x * y))
已经避免了此问题。
-
SC2305
-
对 expr 的正则参数用引号引起来避免被作为 glob 展开。
-
SC2306
-
转义参数中的glob字符为表达式来避免路径名称展开。
-
SC2307
-
expr
需要至少3个参数但是现在只看到了一个。 请确保每个操作符、操作数是一个独立的参数,并且转义 <>&|。
-
SC2308
-
expr length
包含未指定的结果。请优先使用${#var}
。
-
SC2309
-
-eq 将会把这当做变量。使用 = 号来作为字符串比较(或者用 $var 显式展开)
-
SC2310
-
如果一个 'if' 条件成立,此函数会被调用,此时设置的-e会失效。如果要想出现失败时退出脚本执行,请将调用分开。
-
SC2311
-
因为处于命令置换中,会隐式禁用此函数执行设置的 -e。 请在之前添加设置 -e,或者启用 inherit_errexit。
-
SC2312
-
考虑单独调用这个命令来避免遮掩它的返回值(或者使用 '|| true' 以忽略)。
-
SC2313
-
请将数组下标用引号引起以避免被展开为 glob。
-
SC2314
-
在 bats 中,
!
不会引起测试失败。
-
SC2315
-
在 bats 中,
!
不会引起测试失败。请将!
折叠到条件中!
-
SC2316
-
这将局部范围内使变量名只读,可能并非你的本意。使用单独的命令或者对应的
declare
选项代替。
-
SC2317
-
命令似乎不可触达。请检查用法(或者间接调用时忽略)。
-
SC2318
-
此赋值被此
declare
再次使用,但是却无法生效。请使用两个declare
。
-
SC2319
-
$?
引用到一个条件,但不是一个命令。赋值给变量来避免其被覆盖。
-
SC2320
-
$?
引用到echo/printf,并非上一个命令。赋值到变量来避免它被覆盖掉。
-
SC2321
-
数组下标已经是算术上下文。建议删除
$((
和))
。
-
SC2322
-
在算术上下文中,
((x))
和(x)
相同。建议只留下一层圆括号。
-
SC2323
-
a[(x)]
和a[x]
相同。建议不要在用额外圆括号围起来。
-
SC3001
-
在 POSIX sh 中,未定义进程展开。
-
SC3002
-
在 POSIX sh 中,未定义 extglob。
-
SC3003
-
在 POSIX sh 中,未定义
$'..'
。
-
SC3004
-
在 POSIX sh 中,未定义
$".."
-
SC3005
-
在POSIX sh中,未定义循环计数。
-
SC3006
-
在 POSIX sh 中,未定义 standalone
((..))
。
-
SC3007
-
在POSIX sh中,未定义
$[..]
来代替$((..))
。
-
SC3008
-
在POSIX sh中,选择循环未定义。
-
SC3009
-
在POSIX
sh
中,未定义大括号扩展。
-
SC3010
-
在 POSIX sh 中,未定义
[[ ]]
。
-
SC3011
-
在POSIX sh中,here-字符串未定义。
-
SC3012
-
在 POSIX sh 中,未定义词汇
\<
。
-
SC3013
-
在 POSIX sh 中,未定义
-nt
。
-
SC3014
-
在 POSIX sh 中,未定义使用
==
来代替=
。
-
SC3015
-
在 POSIX sh 中,未定义
=~
正则表达式匹配。
-
SC3016
-
在POSIX sh中,单目运算符
-v
(用来代替[ -n "${var+x}" ]
)未定义。
-
SC3017
-
在 POSIX sh 中,未定义使用一元运算符
-a
来代替-e
。
-
SC3018
-
在 POSIX sh 中,未定义
++
。
-
SC3019
-
在 POSIX sh 中,未定义指数。
-
SC3020
-
在 POSIX sh 中,未定义
&>
。
-
SC3021
-
在 POSIX sh 中,未定义
>& filename
(作为>& fd
的相反项)。
-
SC3022
-
在 POSIX sh 中,未定义 命名文件描述符。
-
SC3023
-
在 POSIX sh 中,未定义超出 0 到 9 范围的文件描述符。
-
SC3024
-
在 POSIX sh 中,未定义
+=
。
-
SC3025
-
在 POSIX sh 中,未定义
/dev/{tcp,udp}
。
-
SC3026
-
在 POSIX sh 中,未定义在 glob 括号展开表达式中使用
^
来代替!
。
-
SC3028
-
在 POSIX sh 中,未定义这些全大写变量 VARIABLE。
-
SC3029
-
在POSIX sh中,
|&
代替2>&1 |
未定义。
-
SC3030
-
在POSIX sh中,数组未定义。
-
SC3031
-
在 POSIX sh 中,未定义从 glob 重定向自或者重定向到。
-
SC3032
-
在POSIX sh中,coproc 未定义。
-
SC3033
-
在POSIX sh中, [a-zA-Z_][a-zA-Z0-9_]*之外的命名函数未定义。
-
SC3034
-
在 POSIX sh 中,未定义
$(<文件)
。
-
SC3035
-
在 POSIX sh 中,未定义
`<file`
。
-
SC3036
-
在Dash中,不支持在 -n 之外的echo标记。
-
SC3037
-
在 POSIX sh 中,未定义 echo 标记。
-
SC3038
-
在 POSIX sh 中,未定义 exec 标记。
-
SC3039
-
在 POSIX sh 中,未定义
let
。
-
SC3040
-
在 POSIX sh 中,未定义 *[name]*的设置选项。
-
SC3041
-
在POSIX sh中,设置标记
-E
未定义
-
SC3042
-
在POSIX sh中,设置标记
--default
未定义
-
SC3043
-
在 POSIX sh 中,未定义
local
。
-
SC3044
-
在 POSIX sh 中,未定义
declare
。
-
SC3045
-
在 POSIX sh 中,未定义某些需要标记的命令。
-
SC3046
-
在 POSIX sh 中,未定义使用
source
来代替.
。
-
SC3047
-
在 POSIX sh 中,未定义陷阱 ERR。
-
SC3048
-
在 POSIX sh 中,未定义在
SIG
中使用前缀信号名称。
-
SC3049
-
在 POSIX sh 中,未定义使用小写或者混合大小写的信号名称。
-
SC3050
-
在 POSIX sh 中,未定义
printf %q
。
-
SC3051
-
在POSIX sh中,
source
代替.
未定义
-
SC3052
-
在POSIX sh中,基于算术的转换未定义
-
SC3053
-
在 POSIX sh 中,未定义间接展开。
-
SC3054
-
在 POSIX sh 中,未定义数组引用。
-
SC3055
-
在 POSIX sh 中,未定义数组键展开。
-
SC3056
-
在 POSIX sh 中,未定义前缀名称匹配。
-
SC3057
-
在 POSIX sh 中,未定义字符串索引。
-
SC3059
-
dash中不支持大小写修改,在 POSIX sh 中未定义。
-
SC3060
-
在 POSIX sh 中,未定义字符串替换。