网站Logo 欢迎来到我的博客

shell脚本进阶

zhang
52
2024-03-17

SHELL脚本进阶玩法

创建变量方法

创建变量方式

  • 正常赋值=形式
  • dir=/backup/
  • hostname=hostname
  • 脚本传参数:$1 = 形式
  • user = $1
  • read形式(交互式)
read -p '请输入密码:' pass 
-p输出提示,这个提示如果涉及多行可以使用echo或cat输出 read去掉-p选项即可.
-t 设置超时时间 
-s 不要显示输入的内容(类似于设置密码)  

read使用

#1.cat输出
cat <<EOF
1.安装nginx
2.安装tomcat
3.安装PHP
4.安装所有
5.退出
EOF
#2.vars交互式创建变量
read -p "请输出您的选项:" choose
#3.case
case $choose in
        1) echo "install nginx" ;;
        2) echo "install tomcat" ;;
        3) echo "install PHP" ;;
        4) echo install all ;;
        5) exit ;;
        *)
        echo "Usge:$0 输出对应的选项"
        exit
esac

比较两个数字大小

#1.vars
#read可以输出多个变量
read -p "请输入需要比较的数字num1 num2:" num1 num2
#2.判断是否为数字
if [[ !"$num1" =~ ^-?[0-9]+$ ]] ;then # ! 取反
echo "输入$num1不是数字"
        exit 1
fi
[[ "$num2" =~ ^-?[0-9]+$ ]] || { # ||作用:前面判断不成功则执行后面的命令  
        echo "输入$num2不是数字"
        exit
}
#3.比较
if [ $num1 -eq $num2 ];then
        echo "$num1 == $num2"
elif [ $num1 -gt  $num2  ];then
        echo "$num1 > $num2"
else
        echo "$num1 < $num2"
fi

计算

计算方案 说明 应用场景
awk bc 小数整数都可以
expr 计算整数 检查输入内容是否为数字 通过[ [ ] ]与=~
let/​(())/[ ] 三选一 计算整数 配合循环使用

awk | bc

  • bc
[root@kylin-V10-SP3 /server/scripts]# echo "10/3"|bc -l
3.33333333333333333333
  • awk
num1=666
num2=999
echo "$num1/$num2" | bc -l

awk -v n1=211 -v n2=985 'BEGIN{print n1/n2}'
0.214213

awk -vn1=$num1 -vn2=$num2 'BEGIN{print n1/n2}'
0.666667

expr

  • 可以用于计算(整数)
  • 可以用于检查输入变量是否为数字
  • 理解即可

let

  • 整数,与循环搭配
i=1
let i=i+1 /  i++

检查案例

  • 计算内存空闲率
同一单位 -m显示M为单位 -g显示G为单位 
free -m | awk 'NR==2{print$NF/$2*100"%"}
free -m | awk 'NR==2{print 100-$NF/$2*100"%"}'
  • 书写域名过期检查脚本,https证书过期检查脚本
安装whois
yum install -y jwhois
https证书检查curl -v https://www.baidu.com
域名检查 whois baidu.com
#1.vars
export LANG=en_us.UTF-8
url=$1

#2.检查
if [ $# -ne 1 ];then
	echo "Usage:$0 url "
	exit 1
fi
#3.check whois cmd
#4.检查域名是否过期
#4.1获取过期时间
domain_expire_date=`whois $url|egrep -i 'Expiration (Date|Time)' | awk -F ': ' '{print$2}'`
#4.2转换为秒
domain_expire_date_second=`date -d "${domain_expire_date}" +%s`
today_second=`date +%s`
#4.3进行计算
day_left=`echo "(${domain_expire_date_second}-${today_second})/86400"|bc`
if [ ${day_left} -le 30 ];then
	echo "域名$url将要过期,还剩下${day_left}天"
else
	echo "域名$url没有过期,还剩下${day_left}天"
fi

#5.检查https是否过期
#5.1获取过期时间,需要二级域名
domain_expire=`curl -v https://www.$url |& egrep 'expire date' | awk -F ': ' '{print $2}'`
#5.2转换为秒
domain_expire_date_second=`date -d "${domain_expire}" +%s`
today_second=`date +%s`
#5.3进行计算
day_left=`echo "(${domain_expire_date_second}-${today_second})/86400"|bc`
#5.4判断
if [ ${day_left} -le 30 ];then
        echo "https证书$url将要过期,还剩下${day_left}天"
else
        echo "https证书$url没有过期,还剩下${day_left}天"
fi

循环

for循环

常用
for 变量 in 列表
do
  命令
done
for循环格式
for ((i=1;i<=10;i++))
do
  echo $i
done
第1次运行循环,i=1
进行判断i<=10是否成立,成立继续循环,否则结束循环.
执行do,done之间的命令
循环结束运行i++,进行下一次循环
第2次循环,i=2
进行判断i<=10是否成立,成立继续循环,否则结束循环.
执行do,done之间的命令
循环结束运行i++,进行下一次循环

while循环(核心)

while 条件
do
  命令
done
条件-->if后面加上的[ ]
i=1
while [ $i -le 10 ]
do
  echo $i
  let i++
done

死循环

while true   #true(条件永久生效) 或  :
do
  date +%T
done

while true   #true 或  :
do
  date +%T
  sleep 5 #每运行一次,下次运行等待5秒再开始
done
  • 猜数字脚本(1-100)
生成随机数:num=$((RANDOM%100+1))
#1.vars
num=$((RANDOM%100+1))
#2.while
while true
do     
   read -p "请输入你心中的数字:" n
   [[ "$n" =~  ^[0-9]+$   ]] || {
   echo "输入的不是数字,请重新输入"
   continue
   }
   if [ $n -eq $num ];then
        echo "恭喜你猜对了"
	      exit
   elif [ $n -gt $num ];then
        echo "猜错了,数字有点大了,再小一点"
   else 
	echo "猜错了,数字有点小了,再大一点"
   fi
done

读取文件

格式:
whlie read line(变量)
do
  命令
done < file
运行步骤:
执行while循环语句,读取重定向文件,read逐一读取文件file里的每一行内容并返回给变量line,
在执行循环体里的命令
#创建文件touch ip.txt
10.0.0.202
jd.com
baidu.com
===============================
#1.vars
file=/server/scripts/ip.txt
#2.while
while read line #read读取文件内容存储到line变量中
do
   echo $line
done <$file
  • 批量对ip.txt文件内容进行ping检查和curl/wget检查
wget --help
--spider 访问但不要下载 
-T将所有超时设为 SECONDS 秒
-t 设置重试次数为 <数字> (0 代表无限制)
#1.vars
files=/server/scripts/ip.txt
#2.while
while read line
do
#3.ping
  ping -c 1 -W 5 $line >/dev/null 2>&1
  if [ $? -eq 0 ];then
     echo "$line可以ping通"
  else
     echo "$line不可以ping通"
  fi
#4.wget
   wget  --spider -T 1 -t 1 $line >/dev/null 2>&1
  if [ $? -eq 0  ];then
     echo "$line可以访问"
  else
     echo "$line不可以访问"
  fi
done < $files

循环控制语句

循环控制 说明
exit 退出脚本
continue 跳过、结束当前循环,进行下一次循环
break 打断结束循环
return 函数
  • continue案例
for n in {1..10}
do
   [ $n -eq 5 ] && continue 
   echo $n
done
for n in {1..10}
do
   [ $n -eq 5 ] && break 
   echo $n
done