Debian环境下Shell脚本语法错误求助:then与fi异常问题
解决Shell脚本语法错误的方案
第一个错误的根源
原始报错行:
if [[ ! -z $iopt ]] then { wd=$(pwd) basename "$(test -L "$0" && readlink "$0" || echo "$0")" > /tmp/scriptname
if条件与then在同一行时,必须用**分号;**分隔,这是bash语法的硬性要求;{作为代码块起始标记,后面要么换行,要么跟分号,且块内多个命令之间也需要用分号或换行分隔,不能直接堆叠。
第二个错误的问题点
你修改后的代码存在多处语法漏洞:
- 开启的代码块
{没有对应的}闭合; wd=$(pwd)和basename两个命令在同一行堆叠,未用分号或换行分隔;echo$是不完整命令,缺少输出内容;- 变量引用未加引号,遇到含空格的路径会解析出错。
修正后的完整代码
if [[ ! -z $iopt ]]; then wd=$(pwd) basename "$(test -L "$0" && readlink "$0" || echo "$0")" > /tmp/scriptname scriptname="${wd}/$(cat /tmp/scriptname)" su -c "cp \"${scriptname}\" /usr/bin/monitor" root && echo "Congratulations! Script Installed, now run monitor Command" || echo "Installation failed!" fi
关键修正说明
- 严格遵循
if语法:if [条件]; then的格式; - 去掉不必要的
{}代码块(若要保留,需在块末尾添加},且内部命令用分号/换行分隔); - 拆分堆叠的命令,每行一个命令,提升可读性与语法正确性;
- 用
"${wd}/$(cat /tmp/scriptname)"替代echo拼接变量,避免空格解析问题; - 给
su命令中cp的路径参数加转义引号,防止路径含空格时执行失败; - 补全
echo的完整输出内容,保证命令完整性。
内容的提问来源于stack exchange,提问作者Nick eric adelee
相关产品推荐
相关产品推荐

