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"

脚本含义:
  1. Bash 看到 (( … )),立刻进入“算术模式”。
  2. 在算术模式里,== 被当成“算术相等”运算符,而不是字符串比较。
  3. 操作数 "$1""StartingTime" 都被拿来当“算术变量名”解析。
    • 如果 $1EndTime$'\n',那它不是一个合法的变量名,也不是一个数字 → 当成 0。
    • "StartingTime" 同样不是合法变量名 → 也当成 0。
  4. 于是表达式变成 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。

 


 

 


 

posted on 2025-12-24 10:53  gkhost  阅读(6)  评论(0)    收藏  举报

导航