Bootstrap

shell脚本练习大杂烩,总有一个案例是你需要的!

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 不存在		#都没匹配到的话就会输出这一行

结果:
在这里插入图片描述

;