文章目录
(1) 检查用户家目录中的test.sh文件是否存在,并且检查是否有执行权限.
[root@clr /opt/mywork]# cat 1.sh
#!/bin/bash
#检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权
cd /root
test -f test.sh
if [ $? -eq 0 ];then
test -x test.sh
if [ $? -eq 0 ];then
echo "有test.sh文件且可执行"
else
echo "有test.sh文件但不可执行"
fi
else
echo "没有test.sh文件"
fi
[root@clr /opt/mywork]# bash 1.sh
有test.sh文件但不可执行
[root@clr /opt/mywork]# cd /root
[root@clr ~]# ll
-rw-r--r--. 1 root root 131 4月 27 19:26 test.sh
[root@clr ~]# chmod +x test.sh #修改test.sh这个文件的执行权限
[root@clr ~]# ll
-rwxr-xr-x. 1 root root 131 4月 27 19:26 test.sh
[root@clr ~]# cd /opt/mywork/
[root@clr /opt/mywork]# bash 1.sh
有test.sh文件且可执行
(2) 提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔赛的成员再进一步判断男女性别,男生进男生组,女生进女生组,如果输入错误请提示错误。
- 进入决赛的整数成绩判断;
[root@clr /opt/mywork]# cat 2.sh
read -p "请输入您100米赛跑的秒数:" sec
if [ $sec -gt 0 ] && [ $sec -le 10 ];then
read -p "请输入您的性别(男|女):" sex
if [ $sex == "男" ];then
echo "恭喜进入选拔赛男生组"
elif [ $sex == "女" ];then
echo "恭喜进入选拔赛女生组"
else
echo "输入错误,请重新输入"
fi
else
echo "很遗憾,您被淘汰了"
fi
[root@clr /opt/mywork]# bash 2.sh
请输入您100米赛跑的秒数:4
请输入您的性别(男|女):nan
输入错误,请重新输入
[root@clr /opt/mywork]# bash 2.sh
请输入您100米赛跑的秒数:78
很遗憾,您被淘汰了
[root@clr /opt/mywork]# bash 2.sh
请输入您100米赛跑的秒数:2
请输入您的性别(男|女):男
恭喜进入选拔赛男生组
[root@clr /opt/mywork]# bash 2.sh
请输入您100米赛跑的秒数:5
请输入您的性别(男|女):女
恭喜进入选拔赛女生组
- 进入决赛的小数成绩判断;
[root@clr /opt/mywork]# cat 2.sh
#小数判断:
#!/bin/bash
#提示用户输入秒数
read -p "请输入100米赛跑的秒数:" second
#判断是否为数字
if [[ ! "$second" =~ ^[0-9]+(\.[0-9]+)?$ ]] #正则表达式的匹配方式
then
echo "输入错误,请重新输入。"
exit 1
fi
#判断是否进入选拔赛
if (( $(echo "$second <= 10" | bc -l) )) #bc -l 命令会对输入进行数学计算,如果结果为真,则返回1 否则,返回0。
then
#进入选拔赛
#提示用户输入性别
read -p "请输入您的性别(男/女):" sex
#判断性别
if [[ "$sex" == "男" ]]
then
echo "恭喜您进入男生组!"
elif [[ "$sex" == "女" ]]
then
echo "恭喜您进入女生组!"
else
echo "输入错误,请重新输入。"
fi
else
echo "很遗憾,您未能进入选拔赛。"
fi
[root@clr /opt/mywork]# bash 2.sh
请输入100米赛跑的秒数:9.8956664
请输入您的性别(男/女):男
恭喜您进入男生组!
[root@clr /opt/mywork]# bash 2.sh
请输入100米赛跑的秒数:4656.2
很遗憾,您未能进入选拔赛。
[root@clr /opt/mywork]# bash 2.sh
请输入100米赛跑的秒数:4.23
请输入您的性别(男/女):课件撒
输入错误,请重新输入。
[root@clr /opt/mywork]# bash 2.sh
请输入100米赛跑的秒数:4.6
请输入您的性别(男/女):女
恭喜您进入女生组!
(3) 用case语句解压根据后缀名为 .tar.gz 或 .tar.bz2 的压缩包到 /opt 目录.
(4) 编写能够自动生成一个6位随机密码的脚本.
[root@clr /opt/mywork]# vim 1.sh
#!/bin/bash
#编写能够自动生成一个6位随机密码的脚本
str='1234567890'
#passwd=00 #切记此处绝不可将passwd变量赋值为0,该>代码中是实现字符串的拼接,而不是数字的累加
for i in {1..6}
do
a=$[RANDOM % ${#str}] #${#str}计算出字符串str的长
度,a用于获得0-9之间的任意随机数字
tmp=${str:a:1} #tmp根据任意数字a,从str字符串中获
得a下标及之后的一个字段
passwd+=$tmp #passwd=$($passwd+$tmp)将每次从str>字符串中的任意字段,进行累计拼接
done
echo "生成的6位随机密码为:$passwd"
(5) 输出192.168.80.0/24网段内在线主机的ip地址,统计不在线主机的台数,并把不在线主机的ip地址和不在线时的时间保存到/opt/mywork/ip.txt文件里.
[root@clr /opt/mywork]# vim 4.sh
#!/bin/bash
ip=192.168.80.
j=0
for i in {1..5}
do
#{
ping -c 3 -w 2 $ip$i &> /dev/null
if [ $? -eq 0 ];then
echo "在线的主机有:$ip$i"
else
let j++
echo $ip$i >> /opt/mywork/ip.txt
date >> /opt/mywork/ip.txt #记录不在线主机的>时间
fi
# echo "不在线的主机台数有$j"
# }&
done
#wait #该命令起到的效果是,等到并发执行结束后,才>会执行后面的命令
echo "不在线的主机台数有$j"
知识点拓展:并发执行时,自增变量会失效;
(6) 编写能够按照每100行分割文件的脚本.
[root@clr /opt/mywork]# vim 2.sh
#!/bin/bash
#编写能够按照每100行分割文件的脚本
#定义记录行数的变量
a=0
#定义分割的文件序号标识
b=1
IFS_OLD=$IFS #先备份保存环境变量
IFS=$'\n' #在当前for循环中修改环境变量为以换行符进行分割
read -p "请输入您需要分割的文件(该文件的绝对路径):" file
for i in $(cat $file)
#for i in $(cat passwd)
do
let a++
c=$[a % 100]
if [ $c -eq 0 ];then
echo $i >> wc-$b
let b++
else
echo $i >> wc-$b
fi
done
IFS=$IFS_OLD #运行完for循环条件后,再次将环境变量保存为原来
的值,防止影响后续的for循环操作
(7) 将一个点分十进制格式的IP地址转换成点分二进制格式
比如 255.255.255.255 ——> 11111111.11111111.11111111.11111111
方法一:多方位控制输出二进制;
·
[root@clr /opt/mywork]# vim 3.sh
#!/bin/bash
#使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数(余数倒排法)
read -p "请输入一个十进制的IP地址:" num
num1=$(echo $num | awk -F. '{print $1}')
num2=$(echo $num | awk -F. '{print $2}')
num3=$(echo $num | awk -F. '{print $3}')
num4=$(echo $num | awk -F. '{print $4}')
if [ ${num1} -ge 0 ] && [ ${num1} -le 255 ]; then
for ((i=1; i<=8; i++)) #由于十进制数在0到255之间,可得对应的二进制数最多为8位,循环八次
do
yu1="$[ $num1 %2 ]$yu1" #将$num取余数并赋予$num1, 后面跟一个$num1表示$num1之前的反向输出
num1=$[ $num1 /2 ] #迭代更新num作为被除数的值
done
else
echo "$num1输入错误!"
fi
if [ $num2 -ge 0 ] && [ $num2 -le 255 ]; then
for ((i=1; i<=8; i++)) #由于十进制数在0到255之间,可得对应的二进制数最多为8位,循环八次
do
yu2="$[ $num2 %2 ]$yu2" #将$num取余数并赋予$num1, 后面跟一个$num1表示$num1之前的反向输出
num2=$[ $num2 /2 ] #迭代更新num作为被除数的值
done
else
echo "$num2输入错误!"
fi
if [ $num3 -ge 0 ] && [ $num3 -le 255 ]; then
for ((i=1; i<=8; i++)) #由于十进制数在0到255之间,可得对应的二进制数最多为8位,循环八次
do
yu3="$[ $num3 %2 ]$yu3" #将$num取余数并赋予$num1, 后面跟一个$num1表示$num1之前的反向输出
num3=$[ $num3 /2 ] #迭代更新num作为被除数的值
done
else
echo "$num3输入错误!"
fi
if [ $num4 -ge 0 ] && [ $num4 -le 255 ]; then
for ((i=1; i<=8; i++)) #由于十进制数在0到255之间,可得对应的二进制数最多为8位,循环八次
do
yu4="$[ $num4 %2 ]$yu4" #将$num取余数并赋予$num1, 后面跟一个$num1表示$num1之前的反向输出
num4=$[ $num4 /2 ] #迭代更新num作为被除数的值
done
else
echo "$num4输入错误!"
fi
echo "十进制数${num}转换二进制为: $yu1.$yu2.$yu3.$yu4"
方法二:余数倒排法;
[root@clr /opt/mywork]# vim 3.sh
#!/bin/bash
#使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数(余数倒排法)
read -p "请输入一个十进制的IP地址:" num
num1=$(echo $num | awk -F. '{print $1}')
num2=$(echo $num | awk -F. '{print $2}')
num3=$(echo $num | awk -F. '{print $3}')
num4=$(echo $num | awk -F. '{print $4}')
for i in {1..8} #循环执行8次,确保将0-255范围内的十进制数转换为相应的八位二进制数
do
a1=$[ num1 %2 ]$a1 #将IP地址中第一字段转换为二进制
let num1=$[num1 /2]
a2=$[ num2 %2 ]$a2 #将IP地址中第二字段转换为二进制
let num2=$[num2 /2]
a3=$[ num3 %2 ]$a3 #将IP地址中第三字段转换为二进制
let num3=$[num3 /2]
a4=$[ num4 %2 ]$a4 #将IP地址中第四字段转换为二进制
let num4=$[num4 /2]
done
echo "十进制的IP地址$num转换为二进制数为:${a1}.${a2}.${a3}.${a4}"
方法三:减数正排法;
[root@clr /opt/mywork]# vim 3.sh
#!/bin/bash
#减数正排法
read -p "请输入十进制的IP地址(0-255):" ip
b=0
IFSB=$IFS
IFS=$IFS'.' #修改for循环默认的分隔符,将.分隔符添加到IFS环境变量中
for a in $(echo $ip) #IP字段以点分割为4段
do
for i in {128,64,32,16,8,4,2,1}
do
NUM=$[$a - $i]
if [ $NUM -lt 0 ];then
echo -n "0" #被减数不够减的情况,不换行输出0
else
echo -n "1"
a=$NUM #被减数够减的情况,不换行输出1
fi
done
let b+=1
if [ $b -lt 4 ];then #此处控制输出三个点
echo -n "."
fi
done
echo #此处控制输出空格,换行
(8) 假设/opt/test/ 目录中有多个重要文件,编写脚本使用 md5sum 命令一次性判别目录中的文件是否有发生过改动.
[root@clr /opt/mywork]# vim 5.sh
#!/bin/bash
for file in $(ls /opt/test)
do
SUM_NOW=$(md5sum /opt/test/$file | awk '{print $1}')
#SUM_NOW=$(md5sum $file | awk '{print $1}') #此处获取到的file文件需要绝对路径下的文>件,当上一句中不带/*时,此句也可用/opt/test/$file,查看新获得的校验和
SUM_OLD=$(grep $file /root/md5sum.txt | awk '{print $1}') #提取原先保存的校验和
if [ "$SUM_NOW" != "$SUM_OLD" ];then #如果校验和不一致,则说明文件有改动
echo "$file文件内容有改动!"
fi
done
(9) 输出环境变量PATH的目录所包含的所有可执行文件.