1)通过非交互式和交互式选择安装操作系统。
下面是非交互式(命令行执行脚本时直接输入变量)选择centos系统。
执行脚本时,后面跟的第一个变量就赋值给$1
,选择centos或redhat,然后就会输出对应的内容,否则会有提示。
[root@db01 scripts]# cat test.sh
#!/bin/bash
case $1 in
centos)
echo "centos"
;;
redhat)
echo "redhat"
;;
*)
echo "you should select [redhat|centos]";;
esac
[root@db01 scripts]# sh test.sh centos
centos
下面是交互式选择windows系统的脚本。当输入的内容不是windows或linux时,就会不断循环,直到二选一为止。
[root@db01 scripts]# cat test.sh
#!/bin/bash
read -p "请输入你要选择的系统:" version
while true
do
case $version in
windows)
echo "win10 is ok"
break
;;
linux)
echo "centos is ok"
break
;;
*)
echo "you should select [win10|centos]"
read -p "请输入你要选择的系统:" version
esac
done
[root@db01 scripts]# sh test.sh
请输入你要选择的系统:windows
win10 is ok
2)通过交互式方式查看系统状态。
在执行脚本后,输入h
后,会调用函数menu()
,在屏幕输出相关的提示帮助,即输入什么字母会显示对应的系统状态。此外,该脚本也是一个循环,除非输入q
退出脚本循环(如本脚本中所规定的),或输出给定选项外的其他内容。
[root@db01 scripts]# cat test.sh
#!/bin/bash
menu(){
cat <<EOF
=========
# h-显示命令帮助
# f-显示磁盘分区
# d-显示磁盘挂载
# m-查看内存使用
# u-查看系统负载
# q-退出程序
=========
EOF
}
while true
do
read -p "请输入你想查看的系统状态:" sys
case $sys in
h)
menu
;;
f)
lsblk
;;
d)
df -h
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
*)
echo "error"
exit 1;
esac
done
3)通过其他用户文件来创建用户
测试环境(其他的用户文件)准备:
[root@db01 scripts]# echo -e "Alex\nBob\nCindy\nDavid\nEric" >user.txt
[root@db01 scripts]# cat user.txt
Alex
Bob
Cindy
David
Eric
下面是批量创建用户的脚本
[root@db01 scripts]# cat test.sh
#!/bin/bash
#与最后一行内容共同构成按行读取文件的命令
while read user
#判断user.txt文件中的用户是否存在
do
id $user &>/dev/null
if [ $? -eq 0 ];then
echo "$user is already exist"
else
useradd $user &>/dev/null && \
echo "$user is created ok"
fi
#读取该目录下的user.txt文件
done<user.txt
[root@db01 scripts]# sh test.sh
Alex is created ok
Bob is created ok
Cindy is created ok
David is created ok
Eric is created ok
测试成功,可以通过其他文件来批量创建用户,也可以通过该文件批量删除用户,唯一的区别是,将useradd
换成userdel
。
下面是读取其他文件的用户来批量删除用户。
[root@db01 scripts]# cat test.sh
#!/bin/bash
while read user
do
id $user &>/dev/null
if [ $? -eq 1 ];then
echo "$user is not exist"
else
userdel $user &>/dev/null && \
echo "$user is deleted"
fi
done<user.txt
补充说明:
做死循环用while
,按照行读
固定循环用for
,按照空格读
4)计算Linux系统所有进程占用内存之和
提示:ps aux
找到RSS对应的内存之和
[root@db01 scripts]# cat test.sh
#!/bin/bash
#找到RSS对应列的所有数值,并排除掉‘RSS’这一标题行
num=$(ps -aux|awk '{print $6}'|grep -v 'RSS')
#定义初识内存和变量
sum=0
#用for循环,将所有遍历的值相加,赋值给sum
for i in $num
do
sum=$[($i+$sum)]
done
#最终输出结果
echo $sum
5)猜随机数,以买西红柿讨价还价为例。
要求:在执行脚本后,最上方会显示本次的“西红柿价格”,但我们可以当作看不见,以交互式方式不断输入猜测的西红柿价格,期间可以无数次循环执行,知道猜对价格方可退出循环。
脚本内容如下:
[root@db01 scripts]# cat price.sh
#!/bin/bash
#定义初识的猜测次数变量,赋值给total
total=0
#定义随机数生成的西红柿价格变量,取值范围0~60
num=$((RANDOM%61))
#交互式过程中系统给出的提示内容
echo -e "当前西红柿价格$num元/斤\n========================\n==========================\n现在西红柿怎么卖\n来猜一猜"
#构造函数,判断输入的内容是否是整数,否则会进入该函数的死循环,直到用户输入的是整数
ifint(){
read -p "请输入你要猜的数字:" input
expr $input + 1 &>/dev/null
if [ $? -ne 0 ];then
echo "别玩了,快输入数字吧"
ifint
fi
}
#构造函数,每调用一次函数,表示猜测西红柿价格的动作都会增加一次
#如果直接猜对,还要在该循环内部进一步判断,猜测西红柿几个一共用了几次。
#将猜测的次数划分不同的程度,从而输出不同的内容。
guess(){
((total++))
if [ $input -eq $num ];then
echo "猜对了,就是$input元"
if [ $total -le 3 ];then
echo "厉害,只用了$total次"
elif [ $total -gt 3 -a $total -lt 7 ];then
echo "还不错,用了$total次"
else
echo "要继续加油啊,你用了$total次"
fi
exit 1
#如果猜错,要告诉用户大概方向,是大了,还是小了。
elif [ $input -gt $num ];then
echo "你猜的数字太大了"
#并再次调用自身,进入函数死循环。
ifint
else
echo "你猜的数字太小了"
ifint
fi
}
#构建主函数,内含初识判断函数和猜测函数。
main(){
ifint
while true
do
guess
done
}
#调用主函数
main
6)输出“九九乘法表”
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
脚本如下:
[root@db01 scripts]# cat test.sh
#!/bin/bash
#设置输出结果的颜色和光亮显示
color='\E[47;30m'
res='\E[0m'
#第一个数字取值范围1~9
for num1 in `seq 9`
do
#第二个数字取值范围1~9
for num2 in `seq 9`
do
#表示第一个数字大于等于第二个数字前,都不换行
#例如11、22、33、44....以此类推
if [ $num1 -ge $num2 ];then
#两数之积为两位数时,势必会多占一位,上下不对齐。
if (((num1*num2)>9));then
#表示结果是2位数,因此后面只需一个空格,来与上方(必定比上方数字之积结果大)保持对齐
echo -en "${color}${num1}x${num2}=$((num1*num2))$res "
else
#表示结果是1位数,一次后面需要2个空格,来与下方(必定比下方数字之积结果小)保持对齐
echo -en "${color}${num1}x${num2}=$((num1*num2))$res "
fi
fi
done
echo " "
done
补充说明:
注意查看倒数第六行的输出内容后面有2个空格
与之相对应的上方条件输出内容后面有1个空格
echo -n
表示不换行
echo -e
表示识别转义字符