You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:52:53