Shell脚本中使用if-else条件比较字符串时出现执行错误的问题求助
Shell脚本if-else字符串比较错误排查与修复
我来帮你一步步解决这个脚本的问题,你的代码里有几个典型的shell语法错误,咱们逐个梳理:
1. 命令赋值的语法错误
你给srv和srvtype赋值的写法不对:
srv= echo $servername | tr "a-z" "A-Z"
这种写法会把srv设为空字符串,然后单独执行echo命令,根本没把转换后的结果赋值给变量。正确的做法是用命令替换捕获命令输出,推荐用$()(可读性更好):
srv=$(echo $servername | tr "a-z" "A-Z") srvtype=$(echo $envtype | tr "a-z" "A-Z")
也可以用反引号写法,但$()是更现代的写法,嵌套时不容易出错。
2. 字符串比较运算符错误
在POSIX标准的sh环境里,<>不是有效的“不等于”运算符,要判断字符串不相等,必须用!=。你原来的[ "${srv}" <> "SCP" ]是错误写法,得改成[ "${srv}" != "SCP" ]。
3. [ ]的语法空格问题
[是shell的内置命令(和test命令等价),它的前后必须有空格,同时]的前面也必须有空格。你第二个if条件里的[" ${srv}"少了[后面的空格,导致shell把["当成一个不存在的命令,这就是报错[ SCP: not found的直接原因。
修复后的完整脚本
#!/bin/sh if [ $# -lt 2 ] then echo "Usage $0 servername envtype" exit 1 fi servername=$1 envtype=$2 # 修复命令赋值,捕获大小写转换结果 srv=$(echo $servername | tr "a-z" "A-Z") srvtype=$(echo $envtype | tr "a-z" "A-Z") echo $srv echo $srvtype # 修复比较运算符和[ ]的空格问题 if [ "${srv}" != "SCP" ]; then if [ "${srv}" != "RENTD" ]; then echo "Invalid servername" exit 1; fi fi echo "Server name is valid!"
额外优化提示
如果你的运行环境是bash(而非纯sh),可以用更简洁的大小写转换方式,不用调用tr命令:
srv=${servername^^} # 把字符串转成大写 srvtype=${envtype^^}
不过为了兼容纯sh环境,用tr的写法更稳妥。
内容的提问来源于stack exchange,提问作者Rn3l
相关产品推荐
相关产品推荐

