if语句
单分支
if < 条件表达式>
then 指令
fi
if < 条件表达式> ; then 指令
fi
案例
编写脚本choice1.sh,利用单分支 结构实现输入2个整数,判断最大值后输出($符相当于取值符号)
[ root@server ~]
read -p "请输入第一个整数: " x
read -p "请输入第二个整数: " y
max = $x
if (( $max< $y))
then max = $y
fi [ root@server ~]
请输入第一个整数:6
请输入第二个整数:3
最大值:6
编写脚本choice3.sh ,判断当前脚本的执行者身份,若不是root账户执行则输出提示,并退出
[ root@server ~]
root
[ root@server ~]
0
[ root@server ~]
root
[ root@server ~]
0
[ root@server ~]
if [ "$USER " != "root" ]
then echo "please switch user root"
fi [ root@server ~]
[ root@server ~]
[ fox@server root] $ cd /
[ fox@server /] $ bash choice3.sh
please switch user root
双分支
if < 条件表达式>
then 指令序列1
else 指令序列2
fi
案例
面试题:编写脚本choice2.sh,使用双分支 判断当前系统的剩余内存大小,若低于100M则发送消息进行告警
[ root@server ~]
free_mem = $( free -m | grep Mem | tr -s " " | cut -d " " -f 4 )
if (( $free_mem< 100 ))
then echo "警告,剩余内存为:$free_mem ,低于100MB"
else echo "剩余内存为:$free_mem ,空间足够"
fi [ root@server ~]
剩余内存为:948,空间足够
编写脚本choice4.sh , 实现闰年的判断(闰年:能被4整除但不能被100整除或者能被400整除的年份 )
[ root@server ~]
read -p "请输入四位数年份:" year
if [ $(( $year% 4 )) -eq 0 ] && [ $(( $year% 100 )) -ne 0 ] || [ $(( $year% 400 )) -eq 0 ]
then echo "$year 年是润年"
else echo "$year 年是平年"
fi [ root@server ~]
请输入四位数年份:2018
2018 年是平年
[ root@server ~]
请输入四位数年份:2024
2024 年是润年
编写脚本choice5.sh,判断sshd是否运行
[ root@server ~]
[ root@server ~]
[ root@server ~]
num = $( ps -ef | grep sshd | grep -v grep | wc -l )
if (( $num> 0 ))
then echo "sshd is running"
else echo "sshd is not running"
fi [ root@server ~]
sshd is not running
[ root@server ~]
read -p "请输入测试主机的IP地址:" ip
ping -c 2 -w 3 $ip &> /dev/null
if [ $? -eq 0 ]
then echo "主机$ip 已运行"
else echo "主机$ip 未运行"
fi [ root@server ~]
请输入测试主机的IP地址:192.168.80.130
主机192.168.80.130未运行
for ip in 192.168 .48.{ 125 .. 135 }
do ping -c 2 -w 3 $ip &> /dev/nullif [ $? -eq 0 ] then echo -e "\e [1;31m主机$ip 已运行\e [0m" else echo "主机$ip 未运行" fi
done
多分支
if 条件表达式1
then 指令序列1
elif 条件表达式2
then 指令序列2
else 指令序列n
fi
编写脚本choice6.sh , 输入百分制成绩,判断后输出等级成绩
[ root@server ~]
read -p "请输入百分制成绩: " score
if [ -z $score ]
then echo "未输入,请重新输入."
elif (( $score< 0 || $score> 100 ))
then echo "成绩输入有误,请输入0-100间整数成绩"
elif (( $score >= 90 ))
then echo "成绩优秀"
elif (( $score >= 80 ))
then echo "成绩良好"
elif (( $score>= 60 ))
then echo "成绩及格"
else echo "补考"
fi [ root@server ~]
请输入百分制成绩:
未输入,请重新输入
[ root@server ~]
请输入百分制成绩:100
成绩优秀
编写脚本choice7.sh,判断主机的cpu品牌
[ root@server ~]
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 186
model name : 13th Gen Intel( R) Core( TM) i7-13620H
stepping : 2
microcode : 0x410e
cpu MHz : 2918.399
cache size : 24576 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 32
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip pku ospke gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit eibrs_pbrsb
bogomips : 5836.79
clflush size : 64
cache_alignment : 64
address sizes : 45 bits physical, 48 bits virtual
power management:processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 186
model name : 13th Gen Intel( R) Core( TM) i7-13620H
stepping : 2
microcode : 0x410e
cpu MHz : 2918.399
cache size : 24576 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 32
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip pku ospke gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs itlb_multihit eibrs_pbrsb
bogomips : 5836.79
clflush size : 64
cache_alignment : 64
address sizes : 45 bits physical, 48 bits virtual
power management:[ root@server ~]
vendor_id : GenuineIntel
vendor_id : GenuineIntel[ root@server ~]
vendor = $( grep "vendor_id" /proc/cpuinfo | uniq | cut -d " " -f2 )
if [ $vendor == GenuineIntel ]
then echo "Inter"
elif [ $vendor == GenuineAMD ]
then echo "AMD"
else echo "unknow"
fi [ root@server ~]
Inter
编写脚本choice9.sh,根据用户的输入内容,判断是数字、字母、其它字符
[ root@server ~]
read -p "请输入字母、数字、其它字符: " str
if echo $str | grep [ a-zA-Z] > /dev/null
then echo "字母"
elif echo $str | grep [ 0 -9] > /dev/null
then echo "数字"
else echo "字符"
fi [ root@server ~]
请输入字母,数字,其他字符:890
数字
[ root@server ~]
请输入字母,数字,其他字符:adg
字母
[ root@server ~]
请输入字母,数字,其他字符:! @
字符
case多条件判断
格式
case 变量名 in 值1) 指令1; ; 值2) 指令2; ; 值3) 指令3 ; ; *)默认
esac
执行过程
case语句会将该变量的值 与 )括号中的值相比较 ,如果与某个值相等,则执行对应语句。 当遇到“;;”符号 时,就跳出case语句 ,执行esac语句后面的语句。 如果没有与任何一个值相匹配 ,则执行*)后面的一组语句
示例
编写脚本choice10.sh,对上例7的百分制成绩判断等级成绩进行改写
[ root@server ~]
read -p "请输入百分制成绩: " score
case $score in 9 [ 0 -9] | 100 ) echo "成绩优秀" ; ; 8 [ 0 -9] ) echo "成绩良好" ; ; 6 [ 0 -9] | 7 [ 0 -9] ) echo "成绩及格" ; ; *) echo "补考"
esac [ root@server ~]
请输入百分制成绩:99
成绩优秀
[ root@server ~]
请输入百分制成绩:9
补考