Shell~基础练习
检查用户家目录中的 test.sh 文件是否存在
1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
[ -f test.sh ] && echo "存在"
[ -x test.sh ] && echo "存在" || echo "无执行权限"
chmod +x test.sh
提示用户输入判断
2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误
#!/bin/bash
read -p "输入你的秒数:" s
if [ $s -gt 0 ] && [ $s -le 10 ];then
read -p "恭喜进入选拔赛,请输入你的性别:" sex
if [ $sex = "男" ];then
echo "你加入男生组。"
elif [ $sex = "女" ];then
echo "你加入女生组。"
else
echo "你的性别有问题。"
fi
elif [ $s -gt 10 ];then
echo "你的成绩大于10秒,不合格!"
else
echo "你成绩有问题。"
fi
解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录
3.用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录
#!/bin/bash
gz=$( ls $1 | awk -F. '{print $3}')
echo "解压文件名为:$1 后缀名为:$gz "
case $gz in
"gz")
tar zxf $1 -C /opt
echo "$1 :解压缩完成!"
;;
"bz2")
tar jxf $1 -C /opt
echo "$1 :解压缩完成!"
;;
*)
echo "压缩文件错误!"
esac
使用if 语句判断输入的内容是否为整数
4.提示用户输入内容,使用if 语句判断输入的内容是否为整数。
#!/bin/bash
read -p "请输入一个数:" sum
expr $sum + 1 &>/dev/null
if [ $? -eq 0 ];then
echo "您输入的是一个整数。"
else
echo "您输入的数值不为整数!"
fi
内容是奇数还是偶数
5.根据上一题再判断输入的内容是奇数还是偶数。
#!/bin/bash
read -p "请输入一个数:" sum
expr $sum + 1 &>/dev/null
if [ $? -eq 0 ];then
echo "您输入的是一个整数。"
zhi=$(expr $sum % 2 )
# echo "值为:$zhi"
case $zhi in
0)
echo "$sum : 该数值为偶数"
;;
1)
echo "$sum : 该数值为奇数"
;;
esac
else
echo "您输入的数值不为整数!"
fi
6.用if 语句判断主机是否存活
ping -c 3 -i 0.5 -W 2 $1 &> /dev/null
if [ $? -eq 0 ];then
echo "存活"
else
echo "不存活"
fi
firewalld脚本
7.用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中
使能够使用 service firewalld start|stop|restart|status 来管理firewalld服务,
要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”。
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/SY
[root@localhost ~/SY]# vim testF.sh
#!/bin/bash
case $1 in
start)
systemctl $1 firewalld
;;
stop)
systemctl $1 firewalld
;;
status)
systemctl $1 firewalld
;;
restart)
systemctl $1 firewalld
;;
*)
echo "用法: $0 {start|stop|status|restart}"
esac
计算从1到100所有整数的和
1.计算从1到100所有整数的和
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[$sum+$i]
let i++
done
echo "sum=$sum"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wUb33KWJ-1620894366950)(图片/实验与记录/image-20210512031755027.png)]
用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
2.提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
i=0
sum=0
read -p "输入你要计算的值(1~100):" s
while [ $i -le $s ]
do
sum=$[$sum+$i]
let i++
done
echo "sum=$sum"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wLxNg0bS-1620894366954)(图片/实验与记录/image-20210512031723927.png)]
while求从1到100所有整数的偶数和、奇数和
3.求从1到100所有整数的偶数和、奇数和
i=0
jj=0
oo=0
# read -p "输入你要计算的值(1~100):" s
while [ $i -le 100 ]
do
z=$[$i%2]
case $z in
0)
jj=$[$jj+$i]
let i++
;;
1)
oo=$[$oo+$i]
let i++
;;
esac
done
echo "奇数=$jj"
echo "偶数=$oo"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z5Ic2Suj-1620894366957)(图片/实验与记录/image-20210512031427794.png)]
while判断用户是否存在
4.执行脚本输入用户名,若该用户存在,输出提示该用户已存在;若该用户不存在,提示用户输入密码,建立用户并设立其密码
i=0
while true
do
read -p "输入你的用户名:" s
i=$(id $s) &>/dev/null
if [ $? -eq 0 ]
then
echo "该用户存在。。。"
else
read -p "该用户不存在,创建该用户 $s,请输入密码:" pass
useradd $s
echo "$pass" | passwd --stdin $s &> /dev/null
fi
done
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2IzQiXvJ-1620894366960)(图片/实验与记录/image-20210512031317508.png)]
测试指定的存活主机范围
5.检测指定范围主机是否通信,并将通信的主机ip输出到文件host_ip中
IP="192.168.88."
read -p "指定范围内的主机开始IP尾数:" x
read -p "指定范围内的主机结束IP尾数:" y
for ((i=$x ; i<$y ; i++))
do
ping -c 2 -i 1 -W 3 $IP$i & &> /dev/null
if [ $? -eq 0 ];then
echo "可通信主机IP:$IP$i" > ~/SY/host_ip
fi
done
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAJCSp7j-1620894366962)(图片/实验与记录/image-20210512031137776.png)]
if判断用户&密码是否对应
6.用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SavY9syf-1620894366963)(图片/实验与记录/6.png)]
for获取8位随机密码
7.编写能够自动生成一个8位随机密码的脚本
x=""
for ((i=0 ; $i<8 ; i++))
do
#j=$RANDOM
j=$[$RANDOM % 10]
echo "随机值:$j"
x=$x$j
# 取每个字符串的第一位
#x=$x${j:0:1}
done
echo "$x"
不懂:$[RANDOM%${#a}]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTfHwBAz-1620894366964)(图片/实验与记录/image-20210512094439885.png)]
while逛商场
8.写个逛淘宝选购商品脚本,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继续逛的话进行购物车结算总额。
jg=0
while true
do
read -p "请问你是否逛商场:" a
if [ $a = "y" ];then
read -p "请选择你购买的商品:1衣服500,2裤子400元,3鞋子350元,4帽子150元,5袜子50>元:" p
case $p in
1)
let jg+=500
;;
2)
let jg+=400
;;
3)
let jg+=350
;;
4)
let jg+=150
;;
5)
let jg+=50
;;
*)
echo "没有你需要的商品!!!"
esac
elif [ $a = "n" ];then
echo "你今天总共消费:$jg"
break
else
echo "目的不明确!!!"
fi
echo "你目前总共消费:$jg"
done
if判断成绩:set -x 开启调试模式
当脚本文件较长时,可以使用 set 命令指定调试一段脚本。
#!/bin/bash
set -x //开启调试模式
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
echo "$GRADE 分!优秀"
set +x //关闭调试模式
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo "$GRADE 分,合格"
else
echo "$GRADE 分?不合格"
fi
判断PATH环境变量目录下的可执行文件
# 添加系统默认分隔符为:
IFS=$IFS:
# 定义变量count1和count2用来统计文件总数和可执行文件的总数
count1=0
count2=0
# 将环境变量PATH的路径循环出来,用i来接受
for i in $PATH
{
# 进入到我们循环的目录中
cd $i
# 使用ls命令显示目录中的文件
for j in `ls $i`
do
# 循环一次,将变量count1进行加1
let count1++
# 使用test -x 测试每次循环出来的文件具有执行权限
test -x $j
# 根据上一步返回的状态码进行判断,等于0的话
if [ $? -eq 0 ]
then
# 等于0代表该文件可以执行
# echo $j 可执行
# 然后将count2进行加1
let count2++
else
echo $j
fi
done
}
echo 环境变量'$PATH'的文件总数量为:$count1
echo 环境变量'$PATH'的可执行文件总数量为:$count2
冒泡排序
#!/bin/bash
arry=(14 32 24 54 21 2 24 11 13 42)
echo "排序前:${arry[*]}"
for ((j=0 ; j < ${#arry[*]} ; j++ )){
l=0
for (( i=1 ; i< $[${#arry[*]} - $j ] ; i++ )){
if [ ${arry[$l]} -gt ${arry[$i]} ];then
z=${arry[$i]}
arry[$i]=${arry[$l]}
arry[$l]=$z
fi
let l++
}
}
echo "排序后:${arry[*]}"
选择排序
#!/bin/bash
arr=(26 32 1 5 3 76 25 33 23 41)
long=${#arr[*]}
echo "排序前:${arr[*]}"
set -x
for ((i=1 ; i < $long ; i++ ))
do
l=0
for (( j=1 ; j<=$long-$i ; j++ ))
do
if [ ${arr[$j]} -lt ${arr[$l]} ]
then
l=$j
fi
ll=$[$long-$i]
z=${arr[$ll]}
arr[$ll]=${arr[$l]}
arr[$l]=$z
done
done
echo "排序后:${arr[*]}"