数组(array)
${#var}可以计算出变量的长度
一般而言,A=“a b c def” 这样的变量只是将 $A 替换为一个单一的字符串
但是改为 A=(a b c def) ,则是将 $A 定义为数组
bash 的数组替换方法可参考如下方法:
A[0]可以得到第一个元素
读取数组元素值的一般格式是${array_name[index]}
HOST0=第一个参数
HOST1=第二个参数
HOST2=第三个参数
HOSTS=(${HOST0} ${HOST1} ${HOST2})
echo ${HOSTS[2]} #输出索引为2的参数
echo ${HOSTS[@]} #输出的是所有参数
echo ${!HOSTS[@]} #输出的是数组的索引
let i+=8 等同于 ((i+=8)),但后者效率更高
使用&符号,将执行的函数放入后台执行
wait等待所有进程结束后退出脚本
多线程ping网断存活主机
#!/bin/bash
#检测某个网段内的所有主机(多进程版本)
#定义一个函数,ping某一台主机,并检测主机的存活状态
myping(){
ping -c2 -i0.3 -W1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {1..254}
do
myping 172.40.63.$i &
done
wait
#使用&符号,将执行的函数放入后台执行,wait等待所有进程结束后退出脚本。
#这样做的好处是不需要等待ping第一台主机的回应,wait就可以继续并发ping第二台主机,>依次类推
$! shell最后运行的后台process的PID
进度条
#!/bin/bash
#定义一个显示进度的函数,屏幕快速显示| / - \
rotate_line(){
INTERVAL=0.1 #设置间隔时间
COUNT="0" #设置4个形状的编号,默认编号为0(不代表任何图像)
while :
do
COUNT=`expr $COUNT + 1` #执行循环,COUNT每次循环加1,(分别代表4中不同的形状)
case $COUNT in #判断COUNT的值,值不一样显示的形状就不一样
"1") #值为1显示-
echo -e '-'"\b\c"
sleep $INTERVAL
;;
"2") #值为2显示\\,第一个\是转义
echo -e '\\'"\b\c"
sleep $INTERVAL
;;
"3") #值为3显示|
echo -e "|\b\c"
sleep $INTERVAL
;;
"4") #值为4显示/
echo -e "/\b\c"
sleep $INTERVAL
;;
*) #值为其他时,将COUNT重置为0
COUNT="0";;
esac
done
}
rotate_line
99乘法表
#!/bin/bash
for i in `seq 9`
do
for j in `seq $i`
do
echo -n "$i*$j=$[i*j] "
done
echo
done
使用死循环实时显示eth0网卡流量
#!/bin/bash
#使用死循环实时显示eth0网卡发送的数据包流量
while :
do
echo '本地网卡eth0流量信息如下: '
ifconfig eth0 | grep "RX pack" | awk '{print $5}'
ifconfig eth0 | grep "TX pack" | awk '{print $5}'
sleep 1
done
指定文件用户添加
#!/bin/bash
#本脚本执行,需要提前准备一个user.txt文件,该文件中包含有若干用户名信息
for i in `cat user.txt`
do
useradd $i
echo "123456" | passwd --stdin $i
done
更改后缀名
#!/bin/bash
#执行脚本时,需要给脚本添加位置参数
#脚本名 txt doc(可以将txt的扩展名修改为doc)
#脚本名 doc jpg(可以将doc的扩展名修改为jpg)
for i in "ls *.$1"
do
mv $i ${i%.*}.$2
done
扫描一个IP的端口
#!/bin/bash
IP=$1
first_port=$2
last_port=$3
function scanner
{
for ((port=$first_port; port<=$last_port; port++))
do
(echo >/dev/tcp/$IP/$port)> /dev/null 2>&1 && echo $port open || echo "$port closed"
done
}
scanner
倒计时60秒
for((i=60;i--;i>0))
do
echo -ne "please waite $i seonds \033[0K\r"
sleep 1
done