基础的练习
- 1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
- 2.用case语句解压根据输入的后缀名为 .tar.gz 或 .tar.bz2 的压缩包解压到 /opt 目录
- 3.提示用户输入内容,使用if 语句判断输入的内容是否为整数,再判断输入的内容是奇数还是偶数。
- 4.用if 语句判断主机是否存活
- 5.用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中
- 6. 使用while循环用“*”号画出两个正反等腰三角形
- 7. 根据RAMDON生成8位随机密码,包括数字和字母
- 8. 如何将数组的内容进行反转?
- 9. 如果ping测试一系列ip是否正常并记录延时超过3ms的ip?
- 10. 如何将last的结果中,独立出账号,并且显示曾经登录过的账号?
- 11. 如何显示/bin 下面任何以a为文件名开头的文件的详细数据?
- 12. 如何显示/bin 下面,文件名为四个字符的文件?
- 13. 编写shell脚本实现十进制转二进制
- 14. 如何显示/bin 目录下 不是a-d开头的文件
- 15. 如果想让用户登录后,显示欢迎信息,该怎么操作?
- 16. 编写脚本:获取输入的字符串中数字、空格和特殊符号的数量
- 17. 对输入的用户名进行判断是否存在
1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限
#!/bin/bash
# 1.检查用户家目录中的test.sh文件是否存在,并且检查是否有执行权限
# anthor:cheng
cd ~
if test -e test.sh; then
echo 该文件存在!
if test -x test.sh; then
echo 该文件有执行权限!
else
echo 该文件没有执行权限!
fi
else
echo 该文件不存在!
fi
测试结果:
2.用case语句解压根据输入的后缀名为 .tar.gz 或 .tar.bz2 的压缩包解压到 /opt 目录
#!/bin/bash
read -p "请输入文件名" filename
case $filename in
*.gz)
tar zxvf $filename -C /opt
;;
*.bz2)
tar jxvf $filename -C /opt
;;
*)
echo 格式错误
;;
esac
3.提示用户输入内容,使用if 语句判断输入的内容是否为整数,再判断输入的内容是奇数还是偶数。
#!/bin/bash
read -p "请输入一个数: " num
let $num+1 &> /dev/null
if [ $? -eq 0 ]
then
echo 你输入的是整数!
if [ $[ $num % 2 ] -eq 0 ]
then
echo 偶数
else
echo 奇数
fi
else
echo 你输入的不是整数!
fi
4.用if 语句判断主机是否存活
#!/bin/bash
if ping -c 3 $1 &> /dev/null; then
echo 成功
else
echo 失败
fi
5.用case语句在/etc/init.d/目录中写一个firewalld脚本,并加入到系统服务管理中
使能够使用 service firewalld start|stop|restart|status 来管理firewalld服务,
要求如果命令选项不对,则提示 “用法: $0 {start|stop|status|restart}”。
read -p "输入start|stop|status|restart:来管理防火墙: " server
case $server in
"start")
systemctl start firewalld
;;
"stop")
systemctl stop firewalld
;;
"status")
systemctl status firewalld
;;
"reatart")
systemctl restart firewalld
;;
*)
echo"用法$0{start|stop|status|restart}"
;;
esac
6. 使用while循环用“*”号画出两个正反等腰三角形
正三角形
#外围循环
i=10
while [ $i -gt 0 ]
do
let i--
#打印正三角形左边的空白区域
j=0
while [ $j -lt $i ]
do
let j++
echo -n " "
done
#打印三角形的输出*号
k=19
while [ $k -gt $[$i*2] ]
do
let k--
echo -n "*"
done
# 外围循环的,用来输出换行的
echo ""
done
倒等腰三角形
#外围循环
i=10
while [ $i -gt 0 ]
do
let i--
#打印三角形前面的输出空白区域
k=10
while [ $k -gt $i ]
do
let k--
echo -n " "
done
#打印正三角形左边的空白区域
j=1
while [ $j -lt $[$i*2] ]
do
let j++
echo -n "*"
done
# 外围循环的,用来输出换行的
echo ""
done
打印菱形
#外围循环
i=10
while [ $i -gt 0 ]
do
let i--
#打印正三角形左边的空白区域
j=0
while [ $j -lt $i ]
do
let j++
echo -n " "
done
#打印三角形的输出*号
k=19
while [ $k -gt $[$i*2] ]
do
let k--
echo -n "*"
done
# 外围循环的,用来输出换行的
echo ""
done
i=10
while [ $i -gt 0 ]
do
let i--
#打印三角形前面的输出空白区域
k=10
while [ $k -gt $i ]
do
let k--
echo -n " "
done
#打印正三角形左边的空白区域
j=1
while [ $j -lt $[$i*2] ]
do
let j++
echo -n "*"
done
# 外围循环的,用来输出换行的
echo ""
done
7. 根据RAMDON生成8位随机密码,包括数字和字母
# 定义随机密码生成范围
rd="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789"
for i in $(seq 1 8) # 密码位数为8,所以需要循环8次
{
rd_num=$[$RANDOM%${#rd}] # 随机数范围为1到字符串rd的长度
cipher+=${rd:$rd_num:1} # 随机密码为每次循环出的字母追加
}
echo $cipher # 输出这个8位随机密码
测试结果:
8. 如何将数组的内容进行反转?
# 定义数组随便,我这里按顺序方便对比
array=(a b c d e f g)
echo "反转之前的数组为: " ${array[*]}
# 取出数组的长度
lg=${#array[*]}
# 使用循环,次数为长度的一般即可,因为反转是相互的
for ((i=0;i<lg/2;i++)){
# 每次反转的时候定义一个临时变量用来接受此次反转的第一个变量
temp=${array[$i]}
# 将此次反转操作时的最后一个变量赋予给此次反转的第一个
array[$i]=${array[$lg-$i-1]}
# 然后将临时变量接收的值赋予给此次反转的最后一个
array[$lg-$i-1]=$temp
}
echo "反转之后的数组为: " ${array[*]}
测试结果:
9. 如果ping测试一系列ip是否正常并记录延时超过3ms的ip?
#serverip内的主机ip如下:
[root@cheng0307 exercises]# cat serverip.txt
192.168.80.80
192.168.80.1
192.168.80.77
192.168.80.78
baidu.com
#测试脚本如下:
for i in `cat /exercises/serverip.txt`
{
if ping -c 1 -w 1 $i > /dev/null
then
j=`ping -c 1 -w 1 $i | sed -n -r '/time=/p' | cut -d "=" -f 4 | cut -d "." -f 1`
if [ $j -gt 1 ];then
echo "$i的延迟超过1ms"
else
echo "$i的网络正常"
fi
else
echo "$i不通"
fi
}
结果:
10. 如何将last的结果中,独立出账号,并且显示曾经登录过的账号?
last | cut -d " " -f1 | sort | uniq #方式一
last | awk -F " " '{print $1}' | sort | uniq #方式二
结果:
11. 如何显示/bin 下面任何以a为文件名开头的文件的详细数据?
find ./ -type f -name "a*" -exec ls -l {} \; #方法一
ls -l /bin/a* #方法二
结果:
12. 如何显示/bin 下面,文件名为四个字符的文件?
ls | grep "^....$" #方法一
ls /bin/???? #方法二
结果:
为了方便,统计一下查询结果的数量:
13. 编写shell脚本实现十进制转二进制
# 定义空字符,用于接受二进制数
arr=""
read -p "请输入一个数: " n
# 使用不定循环while,当输入的数为0时结束循环
while [ $n -ne 0 ]
do
y=$[$n % 2] # 变量y为每次余2的余数
n=$[$n / 2] # n每次除后重新赋予给自己
arr+=$y # 将每次得到的余数追加到字符串中
done
echo -n "二进制数为:"
echo $arr | rev # 将得到的字符串进行反转输出即可
结果:
14. 如何显示/bin 目录下 不是a-d开头的文件
ls /bin/ | grep "^[^a-d]" #方法一
ll /bin/[^a-d]* #方法二
结果:
统计一下数量,是一致的
15. 如果想让用户登录后,显示欢迎信息,该怎么操作?
16. 编写脚本:获取输入的字符串中数字、空格和特殊符号的数量
#!/bin/bash
# 测试字符串查找
# anthor:cheng
# 2021年 05月 24日 星期一 21:40:21 CST
read -p "输入字符串: " i
cd=${#i} # 获取字符串的长度
c=0 # 数字的数量
d=0 # 字母的数量
e=0 # 特殊符号的数量
for((a=0;a<=$cd;a++)){ # 循环次数为输入字符串的长度
echo ${i:$a:1} | grep "[0-9]" >> /dev/null # 使用grep判断是否能匹配数字
if [ $? -eq 0 ];then
let c++ # 可以匹配数字 c+1
fi
echo ${i:$a:1} | grep "[a-Z]" >> /dev/null # 使用grep判断是否能匹配字母
if [ $? -eq 0 ];then
let d++ # 可以匹配数字 d+1
fi
echo ${i:$a:1} | grep "[[:punct:]]" >> /dev/null # 使用grep判断是否能匹配特殊符号
if [ $? -eq 0 ];then
let e++ # 可以匹配数字 e+1
fi
}
echo 数字个数为:$c
echo 字母个数为:$d
echo 符号个数为:$e
echo 空格个数为:$[$cd-$c-$d-$e] # 空格为总数量减其他三种
结果:
17. 对输入的用户名进行判断是否存在
方法一:
read -p "请输入用户名: " user
if id $user &> /dev/null ;then #使用id进行判断,如何获取返回值$?
echo "用户存在!"
else
echo "用户不存在"
fi
结果:
方法二:
read -p "输入用户名:" user
i=`cat /etc/passwd | awk -F ":" '{print $1}'` #获取passwd所有行的第一个字段(用户名)
for a in $i #将用户名进行循环遍历
do
if [ $user == $a ];then #如何每一个进行对比
echo 存在
exit # 存在的话直接退出
else
continue #没有匹配到直接跳过
fi
done
echo 不存在 #都没匹配到的话就会输出这一行
结果: