我在 /bin/sh 中编写了一个简单的 shell 脚本并遇到了下面的问题。
/tmp/a.sh: line 14: unexpected EOF while looking for matching `''
/tmp/a.sh: line 17: syntax error: unexpected end of file
*********** Shell 脚本 *************
psqlCmd="DELETE FROM cmdb WHERE cmdb.sys_class_path = '/!!/$['"
答案1
$[ ... ]
是弃用的 bash 语法算术扩展。 从man bash
:
Arithmetic Expansion Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expan‐ sion is: $((expression)) The old format $[expression] is deprecated and will be removed in up‐ coming versions of bash.
例如
$ bash << 'EOF'
echo "'$[1+2]'"
EOF
'3'
但
$ bash << 'EOF'
echo "'$['"
EOF
bash: line 1: unexpected EOF while looking for matching `''
bash: line 2: syntax error: unexpected end of file
POSIX /bin/sh
(由 Ubuntu 提供/bin/dash
)不共享此行为:
$ sh << 'EOF'
echo "'$[1+2]'"
EOF
'$[1+2]'
$ sh << 'EOF'
echo "'$['"
EOF
'$['
所以,尽管你提到“/bin/sh 中的一个简单 shell 脚本”看起来您实际上是在用 bash 运行脚本。无论哪种情况,您都可以通过转义来禁用扩展$
:
psqlCmd="DELETE FROM cmdb WHERE cmdb.sys_class_path = '/!!/\$['"
请注意,在交互的!!
bash shell,你可能还会遇到shell 历史记录的问题事件指示符- 但脚本中历史记录扩展默认是禁用的。
也可以看看: