Shell脚本——if语句判断数值和字符串
一、if(())指令圆括号()做算数比较
#(( … ))只做“算术求值”,任何非空、非 0 的算术结果都当“真”。
Run_Scripts_Interval() { # 第一次传参$1="StartingTime"
# 第二次传参$1="EndTime"
# “算术比较”
# $1为非空(未定义变量或非法字符)和非0字符串,即为0
# "StartingTime"为非法变量名,即为0
# if(( 0 == 0))算数运算判断结果为真
# 表达式变成0 == 0,结果是 1(真),所以你感觉“总是真”。
#(( ))只看算术值,非 0 即真;把字符串硬塞进去,它会把字符串当变量名→找不到就按 0 算,于是你看到“恒假”或“恒真”的假象。
if (( $1 == "StartingTime" )); then
echo "脚本'$0'开始时间:$(date '+%F %H:%M:%S')。" else echo "$1" echo "脚本'$0'结束时间:$(date '+%F %H:%M:%S')。" fi } # 脚本开始执行时间 Run_Scripts_Interval "EndTime"
脚本含义:
-
Bash 看到
(( … )),立刻进入“算术模式”。 -
在算术模式里,
==被当成“算术相等”运算符,而不是字符串比较。 -
操作数
"$1"和"StartingTime"都被拿来当“算术变量名”解析。-
如果
$1是EndTime$'\n',那它不是一个合法的变量名,也不是一个数字 → 当成 0。 -
"StartingTime"同样不是合法变量名 → 也当成 0。
-
-
于是表达式变成
0 == 0,结果是 1(真),所以你感觉“总是真”。
例如:
var=5
(( var )) # 5 → 真
(( var-5 )) # 0 → 假
(( blah )) # blah 未定义 → 0 → 假
(( 0x0A )) # 十六进制 10 → 真
输出结果:❌️
[root@sysmt sa]# sh subscript_sa.sh
请输入开始日期[1-31]: 1
请输入结束日志[1-31]: 2
脚本'subscript_sa.sh'开始时间:2025-12-24 09:31:40。
1.生成当月sa文件:/var/log/sa/sa01
2.生成当月sa文件:/var/log/sa/sa02
脚本'subscript_sa.sh'开始时间:2025-12-24 09:31:40。
二、if[[]]指令中括号[]字符串比较
# [[ … ]] 只能做“字符串/通配符/正则”比较,得不到布尔真/假值
# 要判断字符串用[[ 字符串1 == 字符串2 ]]
#
Run_Scripts_Interval() {
if [[ $1 == "StartingTime" ]]; then
echo "脚本'$0'开始时间:$(date '+%F %H:%M:%S')。"
else
echo "脚本'$0'结束时间:$(date '+%F %H:%M:%S')。"
fi
}
输出结果:✅️
[root@sysmt sa]# sh subscript_sa.sh
请输入开始日期[1-31]: 1
请输入结束日志[1-31]: 2
脚本'subscript_sa.sh'开始时间:2025-12-24 10:51:57。
1.生成当月sa文件:/var/log/sa/sa01
2.生成当月sa文件:/var/log/sa/sa02
脚本'subscript_sa.sh'结束时间:2025-12-24 10:51:57。
稳步前行,只争朝夕。
浙公网安备 33010602011771号