Bash遍历CLI参数时首个条件始终触发的问题求助
问题根源:Bash条件判断的语法错误
嘿,这个问题我太熟了——你踩了Bash条件判断里最容易犯的语法坑之一!
你的第一个条件分支始终执行的核心原因,是**[(也就是test命令)的语法规则被破坏了**。看你写的判断:
if [ $got_file==false ]; then
这里的==两边没有加空格,导致整个$got_file==false被当成了一个单独的字符串参数传给[命令。而[命令的规则是:如果只传入一个非空字符串,它会直接返回“真”(退出码0)。
也就是说,不管got_file的值是true还是false,$got_file==false都会变成一个非空字符串(比如false==false或者true==false),所以这个条件永远为真,第一个分支每次都会触发。
修复方案
要解决这个问题,需要做到两点:
- 在比较运算符
==的两边加上空格,让[能正确识别比较的左右两边; - 变量最好用双引号括起来,防止变量为空时出现语法错误。
同时我还帮你修正了脚本里的其他小问题(比如变量名不一致、date命令的输出方式),修复后的完整脚本如下:
#!/bin/bash echo "starting..." got_file="false" got_sleep_time="false" file="None" sleep_time=0 # 修正变量名,和后面保持一致 for i in "$@"; do # $@加双引号,防止参数含空格时拆分错误 if [ "$got_file" == "false" ]; then file="$i" echo "file is $file, got_file is $got_file, setting it to true." got_file=true elif [ "$got_sleep_time" == "false" ]; then sleep_time="$i" got_sleep_time=true else echo "-WE MADE IT-" echo "The number is $i" date # 直接执行date命令输出当前时间,不用echo sleep "$sleep_time" # 补全sleep命令 fi done
额外提示
如果你习惯用更严谨的语法,也可以用[[ ]](Bash的扩展条件判断),它的语法更灵活,不需要严格的空格(不过还是建议保持良好习惯),而且支持更多特性,比如正则匹配。比如:
if [[ $got_file == false ]]; then
内容的提问来源于stack exchange,提问作者ChumbiChubaGo
相关产品推荐
相关产品推荐

