Bash脚本Select传值至Case异常问题排查求助
Bash脚本Select-Case匹配问题排查
问题现象
使用select选择城市后,只有选择"New York"时能正确返回"country: USA",选择其他选项均返回"unknown"。原脚本及输出如下:
原脚本代码
#!/bin/bash select country in Switzerland, "Los Angeles", Moscow, Paris, London, Dubai, "New York"; do case $country in "Los Angeles" | "New York") echo -n "country: USA" ;; Paris) echo -n "country: London" ;; "Dubai" ) echo -n "Country: Abu-Dhabi" ;; *) echo -n "unknown" ;; esac done
错误输出示例
选择"Los Angeles"时:
1) Switzerland, 2) Los Angeles, 3) Moscow, 4) Paris, 5) London, 6) Dubai, 7) New York #? 2 unknown#?
错误原因
核心问题是**select选项里的元素带了多余的逗号**:
- 除了最后一个选项"New York",其他选项末尾都加了逗号(比如
Switzerland,、"Los Angeles",) - 但
case语句里匹配的是不带逗号的字符串(比如"Los Angeles"),导致实际选中的值和匹配条件不匹配,触发默认的*)分支返回"unknown"
另外还有两处输出错误:
- Paris对应的国家应该是France,不是London
- Dubai对应的国家应该是UAE(阿拉伯联合酋长国),不是Abu-Dhabi(阿布扎比是阿联酋的首都)
修正后的脚本
#!/bin/bash # 去掉选项末尾的逗号,每个选项用空格分隔 select city in Switzerland "Los Angeles" Moscow Paris London Dubai "New York"; do case $city in "Los Angeles" | "New York") echo "country: USA" ;; Paris) echo "country: France" ;; London) echo "country: UK" ;; Moscow) echo "country: Russia" ;; Switzerland) echo "country: Switzerland" ;; Dubai) echo "country: UAE" ;; *) echo "unknown" ;; esac done
测试效果
选择"Los Angeles"时:
1) Switzerland 2) Los Angeles 3) Moscow 4) Paris 5) London 6) Dubai 7) New York #? 2 country: USA #?
选择Paris时:
#? 4 country: France #?
内容的提问来源于stack exchange,提问作者Breaking News
相关产品推荐
相关产品推荐

