shell脚本示例
sh和bash的区别
bash是sh的增强版本,在我们平常实地操作的时候如果sh这个命令不灵了我们应当使用bash。可以看见sh不仅不支持多种命令,而且很多细小的差别。
所以其实我们应该更多的使用bash,也就是./xx.sh,前提是修改权限,chmod a+x xx.sh。
sh -n xx.sh #验证脚本语法是否存在问题 sh -x xx.sh #执行时打印明细
1.创建当天日期的目录
mkdir `date +%Y%m%d`_file

按秒创建:date +%Y%m%d%-I%M%S

创建昨天目录:date -d -1day +%Y%m%d
-d #显示指定时间 -1day # 昨天时间, -2day前天, +1day 明天 +%Y%m%d #获取当前日期格式为20220909
2.输出信息
标准输出,正常的命令返回结果

不展示标准输出: ls > /dev/null

错误输出,命令错误提示
不展示错误输出:sfsalfslfs 2> /dev/null
脚本常用,不输出任何信息: sldfjslf &> /dev/null
3.怎么把多行信息加到文本里
cat > ifcft-ens32:1 <<-EOF TYPE=ethernet NOBOOT=yes DEVICE=ens32:1 IPADDR=192.168.75.200 NETMASK=255.255.255.0 EOF
说明:EFO前加- 自动去掉空格,如果要保持格式不要加-
cat > xxx.sh <<-EFO 内容1 ... 内容2 ... 内容n ... EOF
加-效果
cat > /etc/nginx/conf.d/zabbix.conf <<-EOF server { listen 80; server_name localhost; location / { root /usr/share/zabbix; index index.php index.html index.htm; } location ~ \.php$ { root /usr/share/zabbix; fastcgi_pass 127.0.0.1:9000; fastcgi_buffer_size 64k; fastcgi_buffer 32 64k; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } EOF
4.for循环
复制多个文件
for i in `seq 1 10`; do cp 1G.file 1G.file-$i ;done
每秒文件大小,
for i in `seq 1 100`;do ls -lh /home/ws1/tb ; sleep 1 ;done > /tmp/log123.txt
5.输出文字颜色
echo -e "\033[32m----------------\033[0m"
6.判断进程是否存在
判断进程是否存在 killall -0 nginx # killall -0 并不会杀死进程

提示:查询Killall命令是否安装,安装:yum install psmisc

#!/bin/bash # 判断nginx进程是否存在,如果不存在则... killall -0 nginx if [ $? -eq 0 ] ; then echo "nginx 服务正常。" else echo "nginx 服务异常。" fi
7.脚本开始前判断,不满足则退出脚本。
if [ $# -eq 0 ];then echo -e "\033[32m----------------\033[0m" echo -e "\033[32m usage:{/usr/bin/sh $0 uesrname}\033[0m" exit 7 fi
8.判断文件、目录是否存在
#!/bin/bash # 判断文件、目录是否存在 ######################### #判断有文件,则输出“文件存在” if [ -f /root/test.sh ] ; then echo " 文件存在" #找到文件,执行这里。 echo "`date`" #输出命令结果 else echo "不存在" # 没找到,执行这里。 fi #判断目录是否存在 if [ -d /root/1 ] ;then echo " 目录存在" #找到目录,执行这里。 else echo "不存在" #没找到,执行这里。 fi
9.获取top信息
top -n 1 #显示后退出
top -b #以文本方式显示
top -bn 1 #n要写在后面
10.输出纯数字(磁盘使用率)
方法一(awk取整)
[root@v1 ~]# df -h | awk '{print int($5)}' 0 6 0 0
方法二(sed)
df -h | awk 'NR>1 {print $5}' |sed 's/%//g' 0 6 0 0
11.把一行内容切片,并且换行
[root@localhost tmp]# cat 2.txt
192.168.1.1,192.168.1.2,192.168.1.3,192.168.1.4,192.168.1.5, #原文件内容
使用sed+for循环输出。
[root@localhost tmp]# for i in `sed 's/,/ /g' 2.txt` ; do echo $i ;done
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
写成脚本
#!/bin/bash #1、通过sed把逗号替换成空格; #2、通过for循环输出,达到把一行内容切片换行目的。 # author: 此生逍遥 FILE=`sed 's/,/ /g' /tmp/2.txt` #echo $FILE for i in $FILE; do echo $i #echo "" #输出结果间隔一行 done
12.判断用户是否存在
#!/bin/bash #面试题:编写一个shell,判断系统用户user001,user002,~~~user100是否存在 ######### for i in `seq 1 10`; do id user$i &> /dev/null if [ $? -eq 0 ] ;then echo "账号 user$i 存在" else echo "账号 user$i 不存在" fi done
13.文件横向合并
#!/bin/bash #把a,b两个文件合并成c, 内容a 01|李|2022-01-01 b 01|file/20220101 #c效果 01|李|2022-01-01|01|file/20220101 for i in `seq 1 $(cat a.csv|wc -l )` ; do head -$i a.csv |tail -1 >> $i.csv head -$i b.csv |tail -1 >> $i.csv sed 'N;s/\n/|/' $i.csv >> c.csv done cat c.csv
14.对系统日志文件进行分组打包
#!/bin/bash for i in `ls /tmp/` do tar -czf 2017_log_$i.tgz $i done
15.批量远程复制文件
#!/bin/bash for i in `seq 100 200` do scp -r /tmp/jfedu.txt root@192.168.1.$i:/data/webapps/www done
16.磁盘使用率计算
方法一(sed把换行符换成空格)
#!/bin/bash # 监控磁盘使用率,超过指定使用率后打印出来。 # author:hqq ########### DISK_USE=`df -h | awk 'NR>1 {print $5}' | awk -F% '{print $1}' | sed ':a;N;$!ba;s/\n/ /g'` for i in $DISK_USE;do if (( $i > 50 ));then echo "disk usage $i% > 50%" NUM=$i PART=`df -h | grep -w $NUM` echo "分区信息:$PART" echo "" fi done
方法二(把结果存到一个文件,再for循环)
#!/bin/bash # 监控磁盘使用率,超过指定使用率后打印出来。 # author:hqq ########### a=`df -h | awk 'NR>1 {print $5}' | sed 's/\%//g' > 1.txt` b=50 for i in `cat 1.txt` ;do if (( $i > $b ));then echo "$i% > $b%" NUM=$i PART=`df -h | grep -w $NUM` echo "分区信息:$PART" echo "" fi done
方法三(直接for循环df 切出来的值)
#!/bin/bash a=`df -h | awk 'NR>1 {print $5}' | sed 's/\%//g' ` b=20 for i in $a ;do if (( $i >= $b ));then NUM=$i PART=`df -h | grep -w $NUM` echo "分区信息:$PART" echo "$i% >= $b%" echo "" fi done
检查磁盘使用率
for i in $(df -h|awk 'NR>1 {print $5}'|sed 's/%//g');do if [ $i -gt 1 ];then echo $i% ;fi ;done
本文来自博客园,作者:此生逍遥py,转载请注明原文链接:https://www.cnblogs.com/csxy-py/p/16776709.html