39.Shell IF表达式

Shell IF 表达式

IF 语句的基本结构

基本语法格式

if [ condition ]; then
    # 条件为真时执行的命令
fi

或者多行写法:

if [ condition ]
then
    # 条件为真时执行的命令
fi

完整结构(包含 else 和 elif)

if [ condition1 ]; then
    # condition1 为真时执行
elif [ condition2 ]; then
    # condition2 为真时执行
else
    # 所有条件都为假时执行
fi

IF 语句应用

单分支

[root@shell bin]# cat test_sshd 
#!/bin/bash

systemctl is-active sshd &>/dev/null

if (( $?!=0 ));then
  echo "Sshd is not running"
  echo -n "Start sshd ... "
  systemctl start sshd && echo Success.
fi

双分支

使用命令退出状态码$?来判断sshd服务是否运行

[root@server bin 09:49:46]# vim ssh_ctl_if_1.sh
[root@server bin 09:52:07]# cat ssh_ctl_if_1.sh
#!/bin/bash
systemctl is-active sshd &>/dev/null
return_count=$?

if (( return_count != 0 ));then
   echo "Sshd is not running."
   echo -n "Starting sshd ... "
   systemctl start sshd && echo Success || echo Fail
else
   echo "Sshd is running."
   #echo -n "Stopping sshd ... "
   #systemctl stop sshd && echo Success || echo Fail
fi
[root@server bin 09:52:11]# chmod +x ssh_ctl_if_1.sh 
[root@server bin 09:52:28]# ./ssh_ctl_if_1.sh 
Sshd is running.
[root@server bin 09:52:32]# systemctl stop sshd
[root@server bin 09:52:45]# ./ssh_ctl_if_1.sh 
Sshd is not running.
Starting sshd ... Success
[root@server bin 09:52:55]# systemctl is-active sshd
active

使用命令替换$()来来判断sshd服务是否运行

[root@server bin 09:53:05]# cp ssh_ctl_if_1.sh ssh_ctl_if_2.sh 
[root@server bin 10:03:23]# ls
ssh_ctl_if_1.sh  ssh_ctl_if_2.sh
[root@server bin 10:03:24]# vim ssh_ctl_if_2.sh 
[root@server bin 10:03:48]# cat ssh_ctl_if_2.sh
#!/bin/bash
status="$(systemctl is-active sshd)"

if (( status == "inactive" ));then
   echo "Sshd is not running."
   echo -n "Starting sshd ... "
   systemctl start sshd && echo Success || echo Fail
else
   echo "Sshd is running."
   #echo -n "Stopping sshd ... "
   #systemctl stop sshd && echo Success || echo Fail
fi
[root@server bin 10:08:40]# systemctl stop sshd
[root@server bin 10:08:49]# systemctl is-active sshd
inactive
[root@server bin 10:08:52]# ./ssh_ctl_if_2.sh 
Sshd is not running.
Starting sshd ... Success
[root@server bin 10:08:59]# systemctl is-active sshd
active

多分支

if elif else

[root@server bin 10:20:42]# cp ssh_ctl_if_2.sh ssh_ctl_if_3.sh
[root@server bin 10:21:08]# vim ssh_ctl_if_3.sh 
[root@server bin 10:21:35]# cat ssh_ctl_if_3.sh
#!/bin/bash

if [ "$1" = "start" ];then
   systemctl $1 sshd
elif [ "$1" = "stop" ];then
   systemctl $1 sshd
elif [ "$1" = "status" ];then
   systemctl $1 sshd
else
  echo "Usage: $0 start|stop|status"
fi

[root@server bin 10:21:38]# ./ssh_ctl_if_3.sh status
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2025-10-10 10:08:56 CST; 13min ago
   ... ...
[root@server bin 10:22:04]# ./ssh_ctl_if_3.sh stop
[root@server bin 10:22:11]# ./ssh_ctl_if_3.sh status
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 五 2025-10-10 10:22:11 CST; 2s ago
   ... ...
[root@server bin 10:22:13]# ./ssh_ctl_if_3.sh start
[root@server bin 10:22:18]# ./ssh_ctl_if_3.sh status
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 五 2025-10-10 10:22:18 CST; 2s ago
   ... ...

也可以减少代码量,优化一下

[root@server bin 10:23:58]# vim ssh_ctl_if_4.sh 
[root@server bin 10:24:21]# cat ssh_ctl_if_4.sh
#!/bin/bash

if [ "$1" = "start" -o "$1" = "stop" -o "$1" = "status" ];then
   systemctl $1 sshd
else
  echo "Usage: $0 start|stop|status"
fi

根据上一节的内容,-o,表示或者

综合练习

需求:每3分钟检查一次系统可用内存,如果空闲内存低于100M时给root用户发邮件。

  1. 每3分钟运行一次脚本 cron定时任务完成
  2. 检查内存 free -m | awk ‘/Mem/ {print $4}’
  3. 发邮件 mailx,具体命令示例 mail -s “test” root < /etc/hosts
[root@server bin 10:47:34]# vim check_memory.sh
[root@server bin 10:47:53]# cat check_memory.sh
#!/bin/bash
memory_available_size=$(free -m | awk '/Mem/ {print $NF}')
memory_min_size=10000
if (( memory_free_size < memory_min_size ));then
 echo "Current available memory size is ${memory_available_size}" | \
 mail -s "memory size is lower" root
fi
[root@server bin 10:49:11]# chmod +x check_memory.sh 

# 为了方便测试,这里我们选择每一分钟检查一次
[root@server bin 10:49:56]# crontab -e
[root@server bin 10:51:22]# crontab -l
* * * * * /root/bin/check_memory.sh

# 先安装mailx软件包,使用这个软件包来查看邮件
[root@server bin 10:52:38]# yum install -y mailx
[root@server bin 10:53:08]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 2 messages 2 new
>N  1 (Cron Daemon)         Fri Oct 10 10:52  25/866   
 N  2 (Cron Daemon)         Fri Oct 10 10:53  25/866   
& New mail has arrived.
Held 2 messages in /var/spool/mail/root
您在 /var/spool/mail/root 中有邮件

[root@server bin 10:54:27]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 3 messages 1 new 3 unread
 U  1 (Cron Daemon)         Fri Oct 10 10:52  26/876   
 U  2 (Cron Daemon)         Fri Oct 10 10:53  26/876   
>N  3 (Cron Daemon)         Fri Oct 10 10:54  25/866

总结

  • 基本结构if [ condition ]; then ... fi
  • 测试命令test[ ][[ ]]
  • 文件测试-f, -d, -e
  • 字符串比较=, !=, -z, -n
  • 数值比较-eq, -ne, -gt, -lt
  • 逻辑运算&&, ||, !
在 COMSOL 中遇到试图计算负数的实数平方根而导致的报错问题,可以尝试以下几种解决方法: ### 检查物理模型 1. **边界条件和初始条件**:确保所设置的边界条件和初始条件合理,不会导致 `comp1.shell.I3C` 出现负值。例如,在某些物理问题中,变量代表的物理量本身就不能为负,如温度、密度等。若设置了不合理的初始值或边界值,就可能会使 `comp1.shell.I3C` 为负。 2. **材料属性**:检查材料属性的设置是否正确。某些材料属性可能会影响到 `comp1.shell.I3C` 的计算结果,若材料属性设置错误,可能会导致该变量出现负值。 ### 修改数学表达式 1. **添加条件判断**:可以在定义 `comp1.shell.J` 时添加条件判断,避免对负数进行平方根运算。在 COMSOL 中可以使用 `if` 函数来实现。例如,将 `comp1.shell.J` 的定义修改为: ```plaintext if(comp1.shell.I3C >= 0, sqrt(comp1.shell.I3C), 0) ``` 这样,当 `comp1.shell.I3C` 为非负数时,`comp1.shell.J` 计算其平方根;当 `comp1.shell.I3C` 为负数时,`comp1.shell.J` 的值为 0。 2. **使用复数运算**:若在物理意义上允许使用复数,可以将计算改为复数平方根运算。在 COMSOL 中,对于负数的平方根会自动计算其复数结果。不过,这需要确保整个模型在复数运算下仍然合理,并且后续的计算和分析能够处理复数结果。 ### 数值求解设置 1. **求解器设置**:尝试调整求解器的设置,如增加求解器的精度、改变求解器的类型等。有时候,数值误差可能会导致 `comp1.shell.I3C` 出现微小的负值,通过调整求解器设置可以减少这种误差。 2. **网格划分**:检查网格划分是否合理。若网格过于粗糙,可能会导致数值计算不准确,从而使 `comp1.shell.I3C` 出现负值。可以尝试细化网格,提高计算的精度。 ### 调试和监测 1. **绘制变量曲线**:在 COMSOL 中绘制 `comp1.shell.I3C` 的曲线,观察其在不同位置和时间的取值情况,找出出现负值的区域和原因。 2. **输出中间结果**:在模型中输出与 `comp1.shell.I3C` 相关的中间变量,检查这些变量的计算结果是否合理,从而逐步排查问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值