2022每天学习一个shell小脚本---bash shell脚本文件夹


#!/bin/bash
#批量创建用户
read -p "Enter The Users Password : " PASSWD

for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ] ; then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ] ; then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done

##############################
#!/bin/bash
#猜数字的小游戏
PRICE=$(expr $RANDOM % 1000)
#使用$RANDOM变量来调取出一个随机的数值(范围为0~32767),将这个随机数对1000进行取余操作,并使用expr命令取得其结果
TIMES=0
#创建TIMES变量,用于累计用户猜数字的次数
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do

read -p "请输入您猜测的价格数目:" INT
#read读取输入的数值
let TIMES++
#TIMES变量自增1,即猜数字次数累计1次
if [ $INT -eq $PRICE ] ; then
#如果输入的数字跟随机生成的数字一致,说明猜对了。
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
exit 0
#终止脚本执行
elif [ $INT -gt $PRICE ] ; then
#输入数字比生成数字高,提示太高
echo "太高了!"
else
#兜底,既猜不对数字,又不是比生成数字高,那就是太低了
echo "太低了!"
fi
done

##############################

Checkkeys.sh

#!/bin/bash
#用case语句和通配符判断用户输入的字符是数字、字母还是其他字符。
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
#如果输入的字符(只能是1位,aD则会跳到兜底)是大写字母或者小写字母,则输出是字母
echo "您输入的是 字母。"
;;

[0-9])
#如果是数字(只能1位,10、99等则会跳到兜底),则输出是数字
echo "您输入的是 数字。"
;;

*)
#兜底,输出其他字符
echo "您输入的是 空格、功能键或其他控制字符。"
esac

##############################

findLogin_Users.sh

#找出/etc/passwd中能登录的用户,并将对应在/etc/shadow中第二列密码提出处理
#!/bin/bash
shells=awk -F: '$7!~"nologin"{print $1","$7}' /etc/passwd
for shell in $shells
do
if [[ "grep -v '^#' /etc/shells" =~ "echo $shell | cut -d, -f2" ]]; then
users="$users echo $shell | cut -d, -f1"
fi
done
for user in $users
do
awk -F: -v u=$user '$1~u{print $1,$2}' /etc/shadow
done

##############################

scanPort.sh

#扫描主机端口状态
#!/bin/bash
HOST=$1
PORT="22 25 80 8080"
for PORT in $PORT; do
if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then
echo "$PORT open"
else
echo "$PORT close"
fi
done

##############################

#统计/var/log有多少个文件
echo "文件总量为:"find /var/log -maxdepth 1 -type f | wc -l

-------------

#查找Linux系统中的僵尸进程
ps aux | awk '{if($8 == "Z" ){print $2,$11}}'

-------------

detectNet.sh

#!/bin/bash
#检测所处网段主机的开关机状态
i=1
while [ $i -le 254 ]
do
ping -c2 -i0.2 -W1 192.168.108.$i &>/dev/null
if [ $? -eq 0 ] ;then
echo -e "\e[32;1m192.168.108.$i is up[0m"
else
echo "192.168.108.$i is down"
fi
let i++
done

##############################

findLargfile.sh

#!/bin/bash
#查找最大文件
a=0
for name in .
do
b=$(ls -l $name | awk '{print $5}')
if test $b -ge $a
then a=$b
namemax=$name
fi
done
echo "the max file is $namemax"

##############################

bEditFilename.sh

#!/bin/bash
#批量修改文件名
for file in $(ls *.\txt | cut -d. -f1); do
mv $file* $file.log
done

##############################

monitorRamHd.sh

#!/bin/bash
#监视本机内存、/分区剩余空间,当剩余空间达到阈值发送报警邮件给root管理员
disk_value=60000
mem_value=5000
disk_size=df -m / | awk '/\//{print $4}' #获取/的剩余硬盘空间,单位M
mem_size=free -m | awk '/Mem/{print $4}' #获取剩余内存空间,单位M

if [ $disk_size -le $disk_value -o $mem_size -le $mem_value ]; then
    echo "Insufficient resources,资源不足" | mail -s "Warning" root     #达到阈值发送邮件给root
fi

##############################

recordFileOperat.sh
场景:记录目录下文件操作。
需先安装inotify-tools软件包。

#!/bin/bash
#监控目录,将新创建的文件名追加到日志中

MON_DIR=/root/test
inotifywait -mq --format %f -e create $MON_DIR |
while read files; do
echo $files >> test.log
done

##############################

positional_argument_split.sh

#!/bin/bash
#将位置参数192.168.108.1{1,2}拆分为到每个变量

num=0
for i in $(eval echo $*);do #eval将{1,2}分解为1 2
let num+=1
eval node${num}="$i"
done
echo $node1 $node2