Bash脚本if语句传入多词变量时触发“参数过多”错误求助
解决Bash脚本中带空格变量的if判断bug
哇,你儿子6岁就自学Bash脚本?这也太厉害了!这个bug其实是Bash里很常见的「参数拆分」问题,咱们一步步把它搞明白~
为什么会报错?
当你儿子输入像table tennis这种带空格的两个单词时,Bash会把变量$favSport拆成两个独立的参数:table和tennis。原来的if语句里的判断[ $favSport == football ]就会变成:
[ table tennis == football ]
[(其实是test命令的别名)此时会收到4个参数,超过了它的预期,所以就会报错line 31: [: too many arguments。
几个简单的解决方案
方案1:给变量套上双引号
最直接的办法是给$favSport和判断值都加上双引号,让Bash把整个内容当成一个整体参数传递给[命令。修改后的代码:
read -p "So $name what is your favourite sport? " favSport if [ "$favSport" == "football" ] || [ "$favSport" == "soccer" ] || [ "$favSport" == "Football" ] || [ "$favSport" == "Soccer" ] then echo echo I like "$favSport" too!! else echo echo Oh I do not like "$favSport". My favourite sport is football. fi
就像给变量套了个小盒子,不管里面有几个单词,都会被当成一个完整的东西来处理~
方案2:用case语句简化代码
如果觉得多个||写起来麻烦,可以用case语句,它不仅更简洁,还天然支持多值匹配,同样记得给变量加引号:
read -p "So $name what is your favourite sport? " favSport case "$favSport" in football|soccer|Football|Soccer) echo echo I like "$favSport" too!! ;; *) echo echo Oh I do not like "$favSport". My favourite sport is football. ;; esac
这个写法就像做选择题:把所有喜欢的运动列在第一行,匹配到就执行第一个代码块,其他情况就执行*对应的块。
方案3:忽略大小写,让代码更聪明
如果不想重复写football和Football,可以先把输入的内容转成小写,这样不管输入大写还是小写都能匹配:
read -p "So $name what is your favourite sport? " favSport # 把输入转成小写 lower_fav_sport=$(echo "$favSport" | tr '[:upper:]' '[:lower:]') if [ "$lower_fav_sport" == "football" ] || [ "$lower_fav_sport" == "soccer" ] then echo echo I like "$favSport" too!! else echo echo Oh I do not like "$favSport". My favourite sport is football. fi
这样输入Football或者SOCCER都能被正确识别,代码也更短啦!
你儿子能自己摸索变量和循环的概念已经超棒了,解决这个bug之后肯定会更有成就感的🥳
内容的提问来源于stack exchange,提问作者HonestSausage
相关产品推荐
相关产品推荐

