含if/case条件的Bash脚本执行异常,始终输出错误结果
问题排查与修正方案
以下是导致脚本无论输入什么都输出“It’s not the city”的常见原因及对应修正方法:
常见错误点及修正示例
1. 输入捕获错误
如果read命令没有正确将输入赋值给变量,会导致后续条件判断全不匹配。
错误写法:
echo "Enter city:" read $city # 错误:变量名前多了$符号
正确写法:
echo "Enter city:" read city # 或者带提示的写法 read -p "Enter city: " city
2. if条件判断语法错误
bash中[ ]和[[ ]]的语法规则不同,混用逻辑符会导致条件失效。
错误写法([ ]中误用||):
if [ $city = Kyiv || $city = Berlin ] # 语法错误,[ ]不支持|| then echo "Valid city" else echo "It’s not the city" fi
正确写法:
# 用[ ]时用-o表示“或”,且变量必须加引号避免空值报错 if [ "$city" = "Kyiv" -o "$city" = "Berlin" -o "$city" = "California" ] then # 对应逻辑处理 else echo "It’s not the city" fi # 推荐用[[ ]],支持||/&&,语法更灵活 if [[ "$city" == "Kyiv" || "$city" == "Berlin" || "$city" == "California" ]] then # 对应逻辑处理 else echo "It’s not the city" fi
3. case语句格式错误
case分支缺少;;会导致代码继续执行到默认分支,模式后漏写)也会直接失效。
错误写法:
case $city in Kyiv echo "Capital of Ukraine" # 漏写)和;; Berlin echo "Capital of Germany" *) echo "It’s not the city" esac
正确写法:
case "$city" in "Kyiv") echo "Capital of Ukraine" ;; # 终止当前分支,避免执行后续代码 "Berlin") echo "Capital of Germany" ;; "California") echo "US State" ;; *) echo "It’s not the city" ;; esac
4. 大小写不匹配
脚本中判断的是大写开头的Kyiv,如果输入小写kyiv会直接不匹配。若要忽略大小写,可开启bash的不区分大小写匹配:
shopt -s nocasematch # 开启不区分大小写 case "$city" in "Kyiv") echo "Capital of Ukraine" ;; # ...其他分支 esac shopt -u nocasematch # 关闭不区分大小写(可选)
完整可运行脚本示例
if-elif分支结构
#!/bin/bash read -p "Enter city: " city if [[ "$city" == "Kyiv" ]]; then echo "Capital of Ukraine" elif [[ "$city" == "Berlin" ]]; then echo "Capital of Germany" elif [[ "$city" == "California" ]]; then echo "US State" else echo "It’s not the city" fi
if多条件+case语句
#!/bin/bash read -p "Enter city: " city if [[ "$city" == "Kyiv" || "$city" == "Berlin" || "$city" == "California" ]]; then case "$city" in "Kyiv") echo "Capital of Ukraine" ;; "Berlin") echo "Capital of Germany" ;; "California") echo "US State" ;; esac else echo "It’s not the city" fi
内容的提问来源于stack exchange,提问作者Rom24
相关产品推荐
相关产品推荐

