shell脚本学习二

条件测试1

test测试操作

语法: test 选项 参数
查阅帮助:help test

字符串比较

  • 基本语法
  • 是否为空 [ -z 字符串 ]
  • 等于[ 字符串1 == 字符串2 ]
  • 不等于[ 字符串1 != 字符串2 ]
[ -z "$ss" ]
echo $?
x="HELLO"
#判断是否是空,空为0 非空为1
[ -z "$x" ]
echo $?
#判断是否相等,相等为0,不等为1
[ root == root ]
echo $?

整数值比较

  • [ 整数值1 操作符 整数值2 ]
操作符含义
-eqequal
-nenot equal
-gegreater or equal
-leless or equal
-gtgreater than
-ltless than
#判断是否相等,相等为0,不等为1
[ 3 -eq 2 ]
echo $?

文件状态测试

  • [ 操作符 文件或目录 ]
操作符含义
-e判断对象是否存在,真为0
-d判断对象是否是目录
-f判断对象是否是文件
-r判断对象是否可读
-w判断对象是否可写
-x判断对象是否可执行

条件测试2

组合多个命令

  • 使用控制符组合多个命令
    • ;
    • &&
    • ||
#Y
[ a == a ] && echo Y || echo N
#N
[ a == b ] && echo Y || echo N
local_time=$(date +"%Y-%m-%d %H:%M:%S")
local_ip=$(ifconfig ens33|grep netmask|tr -s " "|cut -d" " -f3)
free_mem=$(cat /proc/meminfo|grep Avai |tr -s " "|cut -d" " -f2)
free_disk=$(df|grep /$|tr -s " "|cut -d" " -f4)
cpu_load=$(cat /proc/loadavg|cut -d" " -f3)
login_user=$(who |wc -l)
process_num=$(ps aux|wc -l)
[ $free_mem -lt 1048576 ] &&
echo "$local_time Free memory not enough.
Free_mem:$free_mem on $local_ip"|
mail -s Warning qishuhua@peakinfo.cn
[ $free_disk -lt 10485760 ] &&
echo "$local_time Free disk not enough.
Free_mem:$free_disk on $local_ip"|
mail -s Warning qishuhua@peakinfo.cn
result=$(echo "$cpu_load >4" |bc)
[ $result -eq 1 ]&&
echo "&local_time CPU load tp high
CPU 15 averageload:$cpu_load on $local_ip"|
mail -s Warning qishuhua@peakinfo.cn
[ $login_user -gt 0 ] &&echo " $local_time Too many user.
$login_user users login to $local_ip"|
mail -s Warning qishuhua@pakinfo.cn

if语句

if单分支语法

  • 当条件成立时执行命令序列
  • 否则,不执行任何操作
if condition
then
    command1 
    command2
    ...
    commandN 
fi
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
#!/bin/bash
read -p "请输入用户名:" user
read -p "请输入密码:" pass
if [ ! -z "$user" ]&&[ ! -z "&pass" ];then
	echo $user $pass
fi

if双分支语法

  • 当条件成立时执行命令序列
  • 否则,不执行任何操作
if condition
then
    command1 
else
    command2
fi
#!/bin/bash
#ping通脚本返回up,否则返回down
if [ -z "$1" ];then
	echo -n "用法:脚本"
	echo -e "\033[32m域名或ip\033[0m"
	exit
fi
ping -c2 -i0.1 -w1 $1 &>/dev/null
if [ $? -eq 0 ];then
	echo "$1 is up"
else
	echo "$1 is down"
fi

if多分支语法

  • 当条件成立时执行命令序列
  • 否则,不执行任何操作
if condition;then
    command1 
elif condition;then
    command1
else
    command2
fi
#!/bin/bash
#猜数字
clear 
num=$[RANDOM%10+1]
read -p "请输入1-10的数:" guess
if [ &guess -eq $num ];then
	echo "猜对了"
elif [ &guess -lt $num ];then
	echo "猜小了"
else
	echo "猜大了"
fi

for循环

for语法

  • 根据变量的不同取值,重复执行命令序列
for 变量 in 值列表
do
 #todo
done
for((初值;条件;步长))
do
	#todo
done
  • 示例
for i in 1 2 3 4
do
	echo $i
done
for i in {1..10}
do
	echo $i
done
for((i=1;i<=5;i++))
do
	echo $i
done
for((i=1;i<10;i++))
do 
	for((j=1;j<=i;j++))
	do  
		echo -n "$i*$j=$[i*j] "
	done 
	echo
done

while循环

while语法

  • 根据条件是否为真,重复执行命令序列
while 条件
do
 #todo
done
i=1
while [ $i -le 5 ]
do 
	echo $i
	let i++
done
i=1
while :
do 
	echo $i
	let i++
	if [ $i -eq 10 ];then
		exit
	fi
done

case 语句

i=1
case i in
1)
	echo 1;;
2)
	echo 2;;
*)
	echo *;;
esac
read -p "are you sure?[y/n]:" sure
case $sure in
y|Y|YES|yes)
	echo "yes";;
n|N|NO|no)
	echo "no";;
*)
	echo "error"
esac

中断与退出

  • continue
  • break
  • exit
for i in {1..5}
do
	[ $i -eq 3 ] && continue
	echo $i
done
echo over

网卡监听

while :
do 
	clear 
	echo "本地网卡ens33流量:"
	ifconfig ens33|grep "RX pack"|tr -s " "|cut -d " " -f6
	ifconfig ens33|grep "TX pack"|tr -s " "|cut -d " " -f6
	sleep 1
done

闰年

for i in {1..5000}
do
	if [[ $[i%4] -eq 0 && $[i%100] -ne 0 || $[i%400] -eq 0 ]];then
		echo "$i :闰年"
	else
		echo "$i:非闰年"
	fi
done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值