侧边栏壁纸
博主头像
Blog博主等级

行动起来,活在当下

  • 累计撰写 211 篇文章
  • 累计创建 94 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

shell常见练习题

第一组

1.wc-l命令可以统计输入内容的行数,请统计/etc/passwd文件行数

2.将cat/etc/passwd输出内容中的sb替换为**(提示:sed命令)

3.输出/etc/passwd文件的第5行(提示:tail和head命令)

4.输出0-20以内随机数(提示:$RANDOM环境变量)

5.查找/etc/目录下所有b开头的文件,将输出按字母顺序排序(提示:sort命令)

6.用/etc/passwd文件的第3行作为提交留言内容

7.输出/etc/passwd文件中所有用户名字段(提示:awk命令)

8.统计/etc/passwd文件中包含sb的行数(提示:grep和wc命令)

9.用一句命令判断是否存在/etc/jx目录,如果不存在则创建并进入

10.将/etc/passwd文件内容作为grep-v sb的输入,将输出结果重定向到/tmp/busb.txt

第二组

1.鸡兔同笼,输入两个参数为笼顶有多少个头和笼底多少只脚,输出鸡有几只兔有几只

示例:bash chook.sh26

输出:鸡1只,兔1只

2.输入两个参数为两个整数,输出两个整数的和、差、积、商、求余

示例:bash calc.sh26

输出:和8 差-4 积12 商0 余2

3.随机一个系统中用户信息中包含sb的用户,将其用户信息中的sb替换为**后提交留言

4.显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小

5.每日将/etc/目录备份到/root/etcyyyy-mm-dd中(yyyy-mm-dd举例2022-04-28格式)

6.显示当前硬盘分区中空间利用率最大的值。

7.计算/etc/passwd文件中的第10个用户和第20用户的ID之和

8.统计/etc,/var,/usr目录中共有多少个一级子目录和文件

第三组

1.输入任意三个整数,判断最大数

示例:bash max.sh 1 2 3

输出:3

2.输入任意1个整数,判断是奇数还是偶数

示例:bash jiou.sh 1

输出:奇数

示例:bash jiou.sh 2

输出:偶数

3.输入一个用户名,判断用户是否存在,如果存在,显示一下用户默认的shell。

示例:bash user.sh root

输出:/bin/bash

4.输入一个数代表最大用户数量,如果当前登录用户数量超过此数,提示危险

提示:用w命令显示当前登录用户列表

示例:bash maxlogin.sh 3

输出:危险

5.输入一个IP地址,检查是否可以通信

6.检查给定路径文件是否存在,并且有执行权限,如果同时满足,

输出同时满足。否则创建文件并增加执行权限

示例:bash chkfile.sh /root/abc.txt

动作:创建/root/abc.txt,增加执行权限

示例:bash chkfile.sh /usr/bin/cat

输出:文件存在并且有执行权限

7.判断100米赛跑的秒数,大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,

进入选拔赛的成员再进一步判断男女性别,如果是男生进男生组,女生进女生组(0为男,1为女)

示例:bash chkrun.sh 8 0

输出:8秒进入选拔赛,分配到男生组

示例:bash chkrun.sh 9 1

输出:9秒进入选拔赛,分配到安生组

示例:bash chkrun.sh 13 1

输出:13秒直接淘汰

8,检查某个目录的磁盘使用率,输入目录和最大使用率,输出是否超过

示例:bash chkdir.sh /root10

输出:使用率超过10%

示例:bash chkdir.sh /run1

输出:使用率不超过1%

第四组

1.给定文件num.txt每行一个数字,找出最大的数字,并求出所有数字的和

示例:bash maxsum.sh num.txt(文件中第1行为1,第二行为2,...第100行为100)

输出:最大数字100,和为5050

2.打印99乘法表

示例:bash99.sh

输出:99乘法表

3.检查局域网192.168.5.0/24内主机是否可以通信

-------------------------------------------------------

示例:bash ping.sh 101 120

输出:

192.168.5.101 可以通信

....

192.168.5.110 不可以通信

....

192.168.5.120 可以通信

-------------------------------------------------------

4.给定文件num.txt每行一个学生成绩,将所有小于60的分数修改为60,存放numok.txt每行一个

-------------------------------------------------------

示例:bash numok.sh num.txt

输出:

-------------------------------------------------------

5.编写脚本,实现人机<石头,剪刀,布>游戏

-------------------------------------------------------

提示:read -p "提示信息" num(可以让用户输入数字到num变量中)

循环要求用户输入,石头为1,剪刀为2,布为3

示例:bash game.sh

你出什么(石头为1,剪刀为2,布为3)3

机器为石头,你赢了

你出什么(石头为1,剪刀为2,布为3)1

机器为石头,你输了

.....

-------------------------------------------------------

6.猜数游戏,让计算机随机产生一个1-100之间数字,人来猜

-------------------------------------------------------

提示:read -p "提示信息" num(可以让用户输入数字到num变量中)

循环要求用户输入数字直到猜中位置

示例:bash gamenum.sh

你猜为多少 65

太小了

你猜为多少 70

太大了

.....

你猜为多少 67

猜中了

-------------------------------------------------------

7.根据输入打印直角三角形

-------------------------------------------------------

示例:bash fang.sh 3

输出:*

**

***

示例:bash fang.sh 5

输出:*

**

***

****

*****

-------------------------------------------------------

8.用/etc/passwd文件中的用户名当作学生,用户ID当作成绩,输出成绩60和评级

-------------------------------------------------------

示例:bash chkscore.sh(小于60分不及格,60-80为中等,80-100为优秀)

输出:学生root成绩为0,不及格

学生daemon成绩为1,不及格

...

学生tcpdump成绩为72,中等

...

第一组解答

1.[root@docker01 ~]# cat /etc/passwd | wc -l

2.[root@docker01 ~]# cat passwd-backup | sed -i 's/sb/**/p'

3.[root@docker01 ~]# cat /etc/passwd | sed -n 5p

4.echo $(date +%N) % 20 |bc

5.[root@docker01 ~]# find /etc/ -name "b*" -type f | awk -F '/' '{print $NF}' | sort

6.[root@docker01 ~]# curl -s "http://127.0.0.1/liuyan/index.php" -d "name=213&con=$(cat /etc/passwd | head -n 3 | tail -n 1)" > /dev/null

7.[root@docker01 ~]# cat /etc/passwd | awk -F ':' '{print $1}'

8.[root@docker01 ~]# cat /etc/passwd | grep sb | wc -l

9. [root@docker01 ~]# ls -d /etc/jx || mkdir -p /etc/jx; cd /etc/jx

10.[root@docker01 ~]# cat /etc/passwd | grep -v sb > /tmp/busb.txt

第二组解答

1.

[root@docker01 script]# cat head_and_foot.sh 

#!/bin/bash

head=$1

foot=$2

x=$(((4*$head-$foot)/2))

y=$((($foot-2*$head)/2))

echo "鸡有"$x"只","兔子有"$y"只"

2.

[root@docker01 script]# cat num.sh 

#!/bin/bash

sum=$(echo "$1 + $2" | bc)

echo "和是: $sum"

jian=$(echo "$1 - $2" | bc)

echo "差是: $jian"

cheng=$(echo "$1 * $2" | bc)

echo "乘积是: $cheng"

shang=$(echo "$1 / $2" | bc)

echo "商是: $shang"

yu=$(echo "$1 % $2" | bc)

echo "余数是:$yu"

3.

#!/bin/bash

# 定义可用留言的数量

num=$(cat /etc/passwd | grep sb | wc -l)

# 产生随机数范围是大于等于1,并且小于等于num

lines=$(echo $(date +%N) %$num + 1| bc)

# 获取 /etc/passwd的第lines行(随机数行)

con=$(cat /etc/passwd | sed -n $count"p" | sed -n "s/sb/**/p")

# 把con中的内容当作留言提交

curl -s http://127.0.0.1/liuyan/index.php -d "name=123&con=$con" > /dev/null

4.

#!/bin/bash

# 获取主机名

echo "主机名: $(hostname)"

# 获取IPv4地址

echo "IPv4地址:"

ip addr show | grep 'inet' | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' 

# 获取操作系统版本

echo "操作系统版本:"

cat /etc/os-release | grep "PRETTY_NAME" | cut -d= -f2 | tr -d '"'

# 获取内核版本

echo "内核版本: $(uname -r)"

# 获取CPU型号

echo "CPU型号:"

lscpu | grep "Model name" | cut -d: -f2 | sed 's/^ //'

# 获取内存大小

echo "内存大小:"

free -h | grep Mem | awk '{print $2}'

# 获取硬盘大小

echo "硬盘大小:"

df -h | awk '/^\/dev/ {print $2}'  | head -1

5.

crontab -e 

59 23 * * * bash /root/script/backupetc.sh 
 

[root@docker01 script]# cat backupetc.sh 

#!/bin/bash

# 获取当前日期,格式为 yyyy-mm-dd

current_date=$(date +%F)

# 设置备份目录

backup_dir="/root/etc$current_date"

# 创建备份目录

mkdir -p "$backup_dir"

# 执行备份,将 /etc 目录内容复制到备份目录

cp -r /etc/* "$backup_dir/"

# 输出备份完成的信息

echo "Backup of /etc completed to $backup_dir"

6.

[root@docker01 script]# df -h | awk  '{print $5}' | grep -v "Use" | sed "s/%//g"|sort -r | sed -n 1p

7.

user_id1=$(cat /etc/passwd | sed -n 10p | awk -F ':' '{print $3}')

user_id2=$(cat /etc/passwd | sed -n 20p | awk -F ':' '{print $3}')

echo $user_id1 + $user_id2 | bc 

8.

#!/bin/bash

usr=$(ls /usr/* |wc -l)

etc=$(ls /etc/* |wc -l)

var=$(ls /var/* |wc -l)

echo "usr目录有"$usr个文件及文件夹

echo "etc目录有"$etc个文件及文件夹

echo "var目录有"$var个文件及文件夹

第三组解答

#!/bin/bash
num1=$1
num2=$2
num3=$3
# 输入任意三个整数,判断最大数
1.
#if [ $num1 -gt $num2 -a $num1 -gt $num3 ]; then
#  echo $num1
#elif [ $num2 -gt $num3 ]; then
#  echo $num2
#else
#  echo $num3
#fi

# 这里用-a连接两个表达式,不能直接用&&连接。
2.
#if [ $(echo "$num1 % 2" | bc) -eq 0 ]; then
#  echo "偶数"
#else
#  echo "奇数"
#fi 

3.
#user=$1
#info1=$(cat /etc/passwd | grep "^$user")
#if [ $? -eq 0 ]; then
#  echo $(cat /etc/passwd | grep "^$user" | awk -F ':' '{print $NF}')
#else
#  echo " "
#fi

4.
#max_user=$1
#current_user=$(w | awk '{print $4}' | sed -n 1p)
#if [ $current_user -gt $max_user ]; then
#  echo "危险"
#else
#  echo " "
#fi 

5.
#ip=$1
#ping -c1 $1  -t2 > /dev/null
#if [ $? -eq 0 ]; then
# echo "$1可以通信"
#else
#  echo "$1不可以通信"
#fi

6.
#path=$1
#ls -l $path | awk '{print $1}' | grep "x" > /dev/null
#if [ -f $path -a $? -eq 0 ]; then
#  echo "$path文件存在并且有执行权限"
#
#else
#  echo "创建$path. 增加执行权限"
#  touch $path > /dev/null && chmod +x $path
#fi

7.
#sec=$1
#sex=$2
#
#if [ $sec -gt 0 -a $sec -le 10 ]; then
#    if [ $sex -eq 0 ]; then
#     echo "$sec秒进入选拔赛,分配到男生组"
#  else
#     echo "$sec秒进入选拔赛,分配到女生组"
#    fi
#else
#  echo "$sec秒直接淘汰" 
#fi

8.
dir=$1
max_used=$2
used=$(df -h $dir | grep -v "Use" | awk '{print $5}' | sed -n "s/%//p")
if [ $used -gt $max_used ]; then 
  echo "使用率超过$max_used%"
else
  echo "使用率不超过$max_used%"
fi

第四组解答

#!/bin/bash
1.
# 
numList=$(cat num.txt)
#最大值
max=0
#和
sum=0

for num in ${numList[@]}; do
  if [ $max -lt $num ]; then
    max=$num
  fi
  sum=$(echo $sum + $sum |bc)
done
echo $max $sum
2.
#!/bin/bash


#echo "1*1="$(echo 1*1 |bc)" "  

for ((i=1;i<=9;i++)); do
  for ((j=1;j<=$i;j++)); do
    echo -n "$j*$i="$(echo $j*$i |bc)" "
  done
  echo ""
done
3.
#!/bin/bash

for ((ip=$1;ip<=$2;ip++)); do
  ping -c1 -t2 192.168.5.$ip
  if [ $? -eq 0 ]; then
   echo "192.168.5.$ip 可以通信"
  else
   echo "192.168.5.$ip 不可以通信"
  fi
done
4.

5.
#!/bin/bash
# 石头1 剪刀2 布3
read -p "请输入你出啥,石头为1,剪刀为2,布为3." num
computer=$(echo $RANDOM % 3 + 1 | bc)
# 如果人出石头
if [ $num -eq 1 ]; then
  if [ $computer -eq 1 ]; then
   echo "平局"
  elif [ $computer -eq 2 ]; then
   echo "你赢了"
  elif [ $computer -eq 3 ]; then
   echo "你输了"
  fi
fi
# 如果人出剪刀
if [ $num -eq 2 ]; then
  if [ $computer -eq 1 ]; then
   echo "你输了"
  elif [ $computer -eq 2 ]; then
   echo "平局"
  elif [ $computer -eq 3 ]; then
   echo "你赢了"
  fi
fi
# 如果人出布
if [ $num -eq 3 ]; then
  if [ $computer -eq 1 ]; then
   echo "你赢了"
  elif [ $computer -eq 2 ]; then
   echo "你输了"
  elif [ $computer -eq 3 ]; then
   echo "平局"
  fi
fi
6.
#!/bin/bash
rand=$(echo $RANDOM % 100 + 1 | bc)

while [ 1 -eq 1 ]; do
  #提示用户输入数字
  read -p "请输入数字:" num
  # 判断是否与随机数相等,或者大小关系
  if [ $num -eq $rand ]; then
   echo "猜中了"
   break
  elif [ $num -gt $rand ]; then
   echo "太大了!"
  elif [ $num -lt $rand ]; then
   echo "太小了!"
  fi
done
7.
#!/bin/bash
for ((i=1;i<=10;i++)); do
  for ((j=0;j<$i;j++)); do
    echo -n "*"
  done
  echo ""
done
8.
#!/bin/bash
stuList=$(cat /etc/passwd | sed "s/ /@/g")
for stu in ${stuList[@]}; do
  name=$(echo $stu | awk -F ":" '{print $1}')
  score=$(echo $stu | awk -F ":" '{print $3}')
  if [ $score -lt 60 ]; then
   echo "$name $score 不及格"
  elif [ $score -ge 60 -a $score -lt 80 ]; then
   echo "$name $score 中等" 
  elif [ $score -ge 60 -a $score -lt 80 ]; then
   echo "$name $score 优秀" 
  fi
done

常见比较总结:

条件表达式 ,对比

整数: 等于-eq 不等于-ne 大于-gt 小于-lt 大于等于-ge 小于等于-le

字符串:等于 "[内容1]" == "[内容2]" , 不等于"[内容1]" != "[内容2]", 空-z "[内容

]", 不空-n "[内容]"

路径:存在-e,文件-f ,目录-d ,不存在 ! -e

逻辑:并且-a(一假则假),或者-o(一真则真),非 !

0

评论区