数值测试
-f 判断文件是否存在 eg: if [ -f filename ]
-d 判断目录是否存在 eg: if [ -d dir ]
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式
-z 空字符串
‐z 可以判断一个变量是否为空
大小写转换
大写转小写
[root@131 shell]# echo AAABBBCCCdddeeeffgh123 |tr A-Z a-z
aaabbbcccdddeeeffgh123
小写转大写
[root@131 shell]# echo AAABBBCCCdddeeeffgh123 |tr a-z A-Z
AAABBBCCCDDDEEEFFGH123
取文件的第一列
cat /etc/passwd |cut -d: -f1
取第六列
cat /etc/passwd |cut -d: -f6
for line in $(cat /etc/passwd);do name=$(echo $line |cut -d: -f1); home=$(echo $line |cut -d: -f6); echo $name的家目录是$home;done
调试脚本
bash -n 脚本名称
检测IP是否合法并测试ip通断
#!/bin/bash
read -p "pleash input a ip:" IP
if ! [[ "$IP" =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]];then
echo "IP is invalid "
exit
elif ping -c1 -W1 $IP &> /dev/null ;then
echo "$IP is up "
else
echo "$IP is down "
fi
yes or no case用法
#!/bin/bash
read -p "do you marry me? yes or no:" ANS
case $ANS in
[Yy]|[Yy][Ee][Ss])
echo AMD
;;
[Nn]|[Nn][Oo])
echo Intel
;;
*)
echo INPUT error
exit
esac
文件后缀的判断
#!/bin/bash
read -p "please input a file:" FILE
SUFFIX=`echo $FILE | grep -Eo "[^.]+$"`
case $SUFFIX in
gz)
echo gzip
;;
bz2)
echo bzip2
;;
xz)
echo xz
;;
Z)
echo compress
;;
zip)
echo zip
;;
*)
echo other
;;
esac
计算1到100相加的值
[root@localhost ~]# seq -s+ 100 |bc
5050
[root@localhost ~]# echo {1..100}|tr ' ' +|bc
5050
[root@localhost ~]# seq 100|paste -sd +|bc
5050
[root@localhost ~]# sum=0;for i in {1..100};do let sum+=i;done ;echo sum=$sum
sum=5050
计算1到100奇数的合
[root@localhost ~]# sum=0;for i in echo {1..100..2};do let sum+=i;done; echo sum=$sum
sum=2500
[root@localhost ~]# seq -s+ 1 2 100 |bc
2500
[root@localhost ~]# echo {1..100..2}|tr ' ' + |bc
2500
echo $sum
脚本
#!/bin/bash
sum=0
for i in {1..100};do
if [ $[i%2] -eq 0 ];then continue;fi
let sum+=i
done
计算1到100偶数的合
[root@localhost ~]# echo {2..100..2}|tr ' ' + |bc
2550
[root@localhost ~]# seq -s+ 2 2 100 |bc
2550
[root@localhost ~]# sum=0;for i in echo {2..100..2};do let sum+=i;done; echo sum=$sum
sum=2550
创建用户10个用户并随机密码
#!/bin/bash
for i in {1..10};do
useradd user$i
PASS=`cat /dev/urandom |tr -dc '[:alnum:]'|head -c 12`
echo $PASS |passwd --stdin user$i &> /dev/null
echo user$i:$PASS >> /root/user.log
echo "user$i is created"
done
删除passwd文件中user开头的用户
for i in `cat /etc/passwd |grep ^user|cut -d: -f1 `;do userdel $i;done
删除user1~user10用户
for i in {1..10};do userdel -r user$i;done
99乘法表
[root@localhost ~]# cat 99.sh
#!/bin/bash
for i in {1..9};do
for j in `seq $i`;do
echo -e "${j}*${i}=$[j*i]\t\c"
done
echo
done
[root@localhost ~]# bash 99.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
批量修改文件后缀
for file in * ;do mv $file $file.bak;done
修改文件名后缀脚本
#!/bin/bash
DIR=/root/testdir
cd $DIR
for FILE in * ;do
# PRE=`echo $FILE|rev|cut -d. -f 2- |rev`
PRE=`echo $FILE| grep -Eo ".*\."`
mv $FILE $PRE.bak
done
ping某个网段哪些IP畅通
for循环第一种写法
#!/bin/bash
NET=192.168.160
cat /dev/null > hosts.txt
for i in {1..254} ;do
if ping -c1 -W1 $NET.$i &>/dev/null;then
echo $NET.$i is up |tee -a hosts.txt
fi
done
for循环第二种写法
#!/bin/bash
NET=192.168.160
cat /dev/null > hosts1.txt
for ((i=1;i<=254;i++));do
if ping -c1 -W1 $NET.$i &> /dev/null;then
echo $NET.$i is up |tee -a hosts1.txt
fi
done
while循环
扫描主机IP端口状态脚本
#!/bin/bash
i=1
host=192.168.160.141
while [ $i -le 65535 ];do
if nc -z $host $i &>/dev/null ;then
echo $i |tee -a port.txt
fi
let i++
done
取文件第二行计算相加的值
cut -d " " -f2 student.txt |paste -s -d +|bc
脚本
#!/bin/bash
while read student ;do
age=`echo $student |cut -d" " -f2`
let sum+=age
done < student.txt
echo $sum
检查磁盘使用率
#!/bin/bash
waring=10
df | sed -rn '/^\/dev\/sd/s#.* ([0-9]+)%.*#\1#p' |while read use;do
if [ $use -gt $waring ];then
echo $use
fi
done
while循环每10s输出一次磁盘使用率
#!/bin/bash
waring=10
while true;do
df | sed -rn '/^\/dev\/sd/s#.* ([0-9]+)%.*#\1#p' |while read use;do
if [ $use -gt $waring ];then
echo $use
fi
done
sleep 10
done
continue:跳过某次循环
案例1
#!/bin/nash
for i in {1..10};do
if [ $i -eq 5 ];then continue ;fi
echo $i
done
案例2
#!/bin/bash
sum=0
for i in {1..100};do
if [ $[i%2] -eq 0 ];then continue;fi
let sum+=i
done
echo $sum
break:结束本次循环
#!/bin/nash
for i in {1..10};do
if [ $i -eq 5 ];then break ;fi
echo $i
done
shift:用于将参量列表list左移指定次数;
bash user.sh a b c d
#!/bin/bash
while [ "$1" ] ;do
useradd $1 && echo $1 is created
shift
done
[root@localhost data]# bash user.sh a b c d
a is created
b is created
c is created
d is created
select
[root@localhost ~]# PS3="选择一个菜品:"
[root@localhost ~]#
[root@localhost ~]# select m in 回锅肉 小炒肉 佛跳墙 ;do echo $m;done
1) 回锅肉
2) 小炒肉
3) 佛跳墙
选择一个菜品:2
小炒肉
选择一个菜品:3
佛跳墙
选择一个菜品:1
回锅肉
选择一个菜品:
脚本
#!/bin/bash
sum=0
PS3="请点菜:"
select M in 北京烤鸭 佛跳墙 小龙虾 羊蝎子 火锅 点菜结束;do
case $REPLY in
1)
echo $M 价格是 ¥100
let sum+=100
;;
2)
echo $M 价格是 ¥88
let sum+=88
;;
3)
echo $M 价格是 ¥66
let sum+=66
;;
4)
echo $M 价格是 ¥100
let sum+=100
;;
5)
echo $M 价格是 ¥200
let sum+=200
;;
6)
echo "点菜结束"
break
;;
*)
esac
done
echo "总价格是:$sum"
执行结果
[root@localhost data]# bash select.sh
1) 北京烤鸭
2) 佛跳墙
3) 小龙虾
4) 羊蝎子
5) 火锅
6) 点菜结束
请点菜:1
北京烤鸭 价格是 ¥100
请点菜:2
佛跳墙 价格是 ¥88
请点菜:5
火锅 价格是 ¥200
请点菜:6
点菜结束
总价格是:388
函数
[root@localhost data]# hello () { echo hello world;echo function; }
[root@localhost data]#
[root@localhost data]# hello
hello world
function
函数初始化系统脚本
#!/bin/bash
#关闭selinux
disable_selinux () {
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
}
#关闭防火墙
disable_firewalld () {
systemctl disable --now firewalld
}
#支持光盘
set_cdrom () {
yum -y install autofs
systemctl enable --now autofs
}
#配置yum仓库
yum_config () {
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[base]
name=CentOS-/\$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/\$releasever/os/\$basearch/
http://mirrors.aliyuncs.com/centos/\$releasever/os/\$basearch/
http://mirrors.cloud.aliyuncs.com/centos/\$releasever/os/\$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
EOF
}
#修改网卡名称
config_network () {
mv /etc/sysconfig/network-scripts/ifcfg-ens33 cat /etc/sysconfig/network-scripts/ifcfg-eth0
sed -i 's/ens33/eth0/g' /etc/sysconfig/network-scripts/ifcfg-eth0
sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
}
#安装常用包
install_packages () {
yum -y install autofs wget
}
#修改环境
set_env () {
cat >/etc/profile.d/env.sh <<EOF
PS1="\[\e[1;34m\]# \[\e[1;36m\]\u \[\e[1;0m\]@ \[\e[1;32m\]\h \[\e[1;0m\]in \[\e[1;33m\]\w \[\e[1;0m\][\[\e[1;0m\]\t\[\e[1;0m\]]\n\[\e[1;31m\]$\[\e[0m\] "
export EDITOR=vim
export HISTTIMEFORMAT="[%F %T]"
EOF
}
disable_selinux
disable_firewalld
set_cdrom
yum_config
config_network
install_packages
set_env
reboot
临时文件或者临时目录
临时文件
root@localhost ~]# mktemp testXXXXX
testdVQFV
临时目录
[root@localhost ~]# mktemp -d testXXXX
testrgE0
脚本
#!/bin/bash
DIR=`mktemp -d /tmp/trash-$(date +%F_%T-%M-%S)XXXXX`
mv $* $DIR
echo $* is move to $DIR
####
alias rm=/data/temp.sh
#####
chmod +x /data/temp.sh
####
[root@localhost ~]# rm hosts1.txt
hosts1.txt is move to /tmp/trash-2022-10-21_17:41:48-41-48odi1T
#####
执行结果
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ls
systemd-private-e845e2add17940df8a05dccd32ee2d5e-bolt.service-5l2aiG vmware-root_6524-701075127
systemd-private-e845e2add17940df8a05dccd32ee2d5e-chronyd.service-GEMHRs vmware-root_6525-1715344745
systemd-private-e845e2add17940df8a05dccd32ee2d5e-colord.service-G4Hj6V vmware-root_6528-692621236
systemd-private-e845e2add17940df8a05dccd32ee2d5e-cups.service-O6hoCO vmware-root_6546-734103590
systemd-private-e845e2add17940df8a05dccd32ee2d5e-rtkit-daemon.service-glsSQx vmware-root_6548-734234657
trash-2022-10-21_17:41:48-41-48odi1T vmware-root_6563-1714820560
[root@localhost tmp]# cd trash-2022-10-21_17\:41\:48-41-48odi1T/
[root@localhost trash-2022-10-21_17:41:48-41-48odi1T]# ls
hosts1.txt
####
一条命令实现
function rm () { local trash=
mktemp -d /tmp/trashXXXX;mv $* $trash; }