以下部分习题摘自博文:https://blog.csdn.net/yugemengjing/article/details/82469785
1、编写第一个shell脚本
#!/bin/bash
echo "hello shell!" //输出字符串
2、if else 分支判断
num1=100
num2=100
if test $num1 -eq $num2
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
3、for 循环
for skill in Adan Bop Ccosd Decso;
do
echo "the skill is ${skill}."
done
4、执行脚本的时候传递参数到shell脚本内 ($0表示文件名;$1表示接收的第一个参数,依次类推)
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
如果执行shell的时候用了:./test.sh 1 2 3 ,那么结果为:
5、EOF用法
Shell中通常将EOF与 << 结合使用&#xff0c;表示后续的输入作为子命令或子Shell的输入&#xff0c;直到遇到EOF为止&#xff0c;再返回到主调Shell。
当然这个EOF只是个分界符&#xff0c;你可以用任意自定义字符串代替&#xff1b;将内容当成标准输入传递给程序。
如&#xff1a;&#xff08;将EOF作为分界符&#xff0c;输入EOF后传递所有用户输入到文件中&#xff09;
将EOF换成其他字符串&#xff1a;
每次往文件里输入&#xff0c;默认都是直接替换掉文件中内容&#xff1b;
如果要在shell文件里使用EOF&#xff0c;如下&#xff0c;连接本机数据库&#xff0c;查询user表中内容&#xff1a;
6、定时打包日志
#!/bin/bash
# 每天 凌晨2点&#xff0c;使用 tar 命令备份/root/fll/log/下的所有日志文件
# 注意 date 是命令需要使用反引号括起来执行
tar -zczf log-&#96;date &#43;%Y%m%d&#96;.tar.gz /root/fll/log/
# crontab ‐e #编写计划任务,执行备份脚本&#xff0c;具体使用参考&#xff1a;https://mp.csdn.net/postedit/98209544
*/3 * * * * cd /root/fll/ && ./test.sh
7、监控内存和磁盘容量&#xff0c;小于给定值时报警
#!/bin/bash
# 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员
# 提取根分区剩余空间
disk_size&#61;$(df / | awk &#39;/\//{print $4}&#39;)
# 提取内存剩余空间
mem_size&#61;$(free | awk &#39;/Mem/{print $4}&#39;)
while :
do
# 注意内存和磁盘提取的空间大小都是以 Kb 为单位
if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
then
mail ‐s "Warning" root < Insufficient resources,资源不足
EOF
fi
done
8、猜数字
#!/bin/bash
# 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
# 猜小了或猜大了,直至用户猜对脚本结束。
# RANDOM 为系统自带的系统变量,值为 0‐32767的随机数
# 使用取余算法将随机数变为 1‐100 的随机数
num&#61;$[RANDOM%100&#43;1]
echo "$num"
# 使用 read 提示用户猜数字
# 使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于), ‐lt(小于),‐le(小于等于)
while : #如果有表达式&#xff0c;则不需要加&#xff1a;
do
read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai
if [ $cai -eq $num ] #“[、]”旁边要有空格
then
echo "恭喜,猜对了"
exit
elif [ $cai -gt $num ]
then
echo "Oops,猜大了"
else
echo "Oops,猜小了"
fi
done
9、创建一个新用户&#xff0c;输入用户名若用户名不输入则提示退出&#xff1b;若输入&#xff0c;则继续输入密码&#xff0c;默认不输入为123456。
#!/bin/bash
# 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户
# 不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默 认的 123456 作为默认密码。
read -p "请输入用户名: " user
#使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2
#没有输入用户名脚本退出后,使用$?查看的返回码为 2
if [ -z $user ];then
echo "您需输入账户名"
exit 2
fi
#使用 stty ‐echo 关闭 shell 的回显功能
#使用 stty echo 打开 shell 的回显功能
stty -echo
#用户已存在则提示update。。
egrep "$user" /etc/passwd > /dev/null
if [ $? -eq 0 ];then
read -p "请更新密码: " pass
else
read -p "请输入密码: " pass
fi
stty echo
pass&#61;${pass:‐123456}
useradd "$user"
echo "$pass" | passwd ‐‐stdin "$user"
10、Linux里的switch case
echo "please input your choice from the list."
#echo -e 激活转义字符 这里换行
echo -e "1.apple\n2.peach\n3.orange"
read choice
case $choice in
1)echo "apple pie."
;;
2)echo "i like it so much."
;;
3|4|5)echo "orange juice." #多个选择用|分割
;;
*)echo "others."
;;
esas
11、&#xff08;for 循环使用&#xff09;查看一个网段内1~254的主机有多少是开机状态
#!/bin/bash
# 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
# 状态(for 版本)
for i in {1..254}
do
# 每隔0.3秒ping一次&#xff0c;一共ping2次&#xff0c;并以1秒为单位设置ping的超时时间
ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i &>/dev/null
if [ $? -eq 0 ];then
echo "192.168.4.$i is up"
else
echo "192.168.4.$i is down"
fi
done
12、上面这个例子&#xff0c;就是要等待前一台ping完后才能继续&#xff0c;如此下去很耗时&#xff0c;那么可以考虑多进程方式。
#!/bin/bash
# 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
# 状态(多进程版)
#定义一个函数,ping 某一台主机,并检测主机的存活状态
myping(){
ping ‐c 2 ‐i 0.3 ‐W 1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {1..254}
do
myping 192.168.4.$i & # 放入后台执行
done