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 中,未定义字符串替换。