运行Bash脚本报Command not found 变量未识别问题求助
报错原因
- 核心问题:Bash中
[是独立的内置测试命令(和test命令完全等价),不是if语法的固定符号,命令名、参数、结尾的]之间必须保留空格分隔。 - 你写的
if [$bday == $dates]中,[和紧随其后的$bday变量值直接拼接,Shell会把拼接后的整串(比如用户输入1990-01-01的话就是[1990-01-01)当作要执行的命令名查找,系统中不存在这个命令,就会抛出Command not found错误。 - 额外隐藏问题:
- 变量未加双引号包裹,一旦用户输入为空、带空格的内容,会触发参数拆分导致判断逻辑失效
- 单中括号
[ ]中使用==做字符串比较不符合POSIX标准,跨环境运行可能不兼容,标准写法是用= - 结尾的
]和前面的比较值之间也需要留空格,否则同样会报语法错误
即时修复版代码(先解决当前报错,实现基础比对功能)
#!/bin/bash echo "please enter your bday YYYY-MM-DD" read -r bday # 获取当前日期的YYYY-MM-DD格式 current_date=$(date +%F) echo "Current date: $current_date" # 注意[ 后面、] 前面都留空格,变量加双引号,比较用= if [ "$bday" = "$current_date" ] then echo "Happy Birthday" else echo "Happy not Birthday" fi
后续日期规整功能实现方案
你计划做的「提取日期中的年月日、统一规整为YYYY-MM-DD格式再比对」,不用自己手动拆分数字拼接,直接用系统自带的date命令做格式校验和标准化最稳妥,还能自动识别不合法的日期输入:
#!/bin/bash read -r -p "Please enter your birthday (any common date format is supported): " input_bday # 尝试把用户输入的日期解析为标准YYYY-MM-DD格式,解析失败则报错退出 if ! standard_bday=$(date -d "$input_bday" +%F 2>/dev/null) then echo "Error: invalid date input, please enter a valid date." exit 1 fi current_date=$(date +%F) echo "Your birthday(standard format): $standard_bday" echo "Current date: $current_date" if [ "$standard_bday" = "$current_date" ] then echo "Happy Birthday!" else echo "Today is not your birthday." fi
这个版本支持用户输入任意date命令能识别的日期格式,比如2000/1/1、1 may 2000、2000.05.01这类输入,都会自动转成2000-05-01的标准格式再做比对,同时会拦截无效的日期输入。
内容的提问来源于stack exchange,提问作者JnooriRS
相关产品推荐
相关产品推荐

