shell综合练习题(图文并茂、代码清单)

本文介绍了Shell脚本中for、while、until循环的实现,展示了不同方式输出变量值的方法,并通过实际脚本演示了如何进行数值计算、递归遍历目录及文件、数组排序和正则表达式匹配电话号码。同时,提供了从文件读取数字并降序排列去重的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、请用shell脚本for,while,until这三种方式写出输出1到100的所有偶数的方法。(5分)

for

#!/bin/bash
#输出1到100的所有偶数
#for

for ((i=1; i<=100; i++))
do
        if [ $[$i%2] -eq 0 ];then
                echo $i
        fi
done

在这里插入图片描述

while

#!/bin/bash
#输出1到100的所有偶数
#while

i=1
while [ $i -le 100 ]
do
        if [ $[$i%2] -eq 0 ];then
                echo $i
        fi
        let i++
done

在这里插入图片描述

until

#!/bin/bash
#输出1到100的所有偶数
#until

i=1
until ((i>100))
do
        if [ $[$i%2] -eq 0 ];then
                echo $i
        fi
        let i++
done

在这里插入图片描述
在这里插入图片描述

2、假设变量i=20 * 5,请用shell脚本格式写出4种方法输出 i 的值。(5分)

#!/bin/bash
#假设变量i=20 * 5,请用shell脚本格式写出4种方法输出 i 的值

#方法一
i=$[20*5]
echo $i

#方法二
i=$( expr 20 \* 5 )
echo $i

#方法三
i=$((20*5))
echo $i

#方法四
let i=20*5
echo $i

在这里插入图片描述
在这里插入图片描述

3、请通过在命令行中执行./output 20 30 输出20+30的值,脚本中使用sum()函数封装代码并通过调用sum函数返回结果,用2种方法返回结果。(10分)


#!/bin/bash
#请通过在命令行中执行./output 20 30 输出20+30的值,脚本中使用sum()函数封装代码并通过调用sum函数返回结果,用2种方法返回结果

#方法一
sum1 (){
        echo "第一个参数值为$1"
        echo "第二个参数值为$2"
        sum=$[$1+$2]
        echo $sum
}

sum1 $1 $2

#方法二
sum2 (){
        echo "第一个参数值为$1"
        echo "第二个参数值为$2"
        return $[$1+$2]
}

sum2 $1 $2
echo $?

在这里插入图片描述
在这里插入图片描述

4、先mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,再用递归函数输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件(10分)

#!/bin/bash
#先mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt
#再用递归函数输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

listdir() {
for a in $1/*
do
  if [ -d $a ];then
     echo "目录:$2$a"
     listdir $a " $2"
  elif [ ! -x $a ] && [ -f $a ];then
     echo "不可执行文件:$2$a"
  fi
done
}

OLDIFS=$IFS
IFS=':'
for i in $PATH
do
  echo "子目录:$i" 
  listdir $i " "
done
IFS=$OLDIFS

在这里插入图片描述
在这里插入图片描述

5、请结合使用shell数组排序算法的方式把 123.txt 文件中的数字按照降序排序输出在同一行当中,并要求没有重复数字。(10分)

cat 123.txt 
1 4 7 9 4
2 5 8 3 8
3 6 9 7 6
#!/bin/bash
#请结合使用shell数组排序算法的方式把 123.txt 文件中的数字按照降序排序输出在同一行当中,并要求没有重复数字
#转数组
a=0
for i in `awk '{print $0}' 123.txt`
do
        arr[$a]=$i
        let a++
done
echo "转换数组arr为:${arr[*]}"
#排序(降序)
maopao (){
        echo "原数组的顺序为:${arr[*]}"
        length=${#arr[*]}

        for ((i=1; i<=$length; i++))
        do
                for ((j=0; j<$length-$i; j++))
                do
                        first=${arr[$j]}
                        k=$j+1
                        second=${arr[$k]}
                        if [ $first -lt $second ];then
                        temp=${arr[$j]}
                        arr[$j]=$second
                        arr[$k]=$temp
                fi
        done
done
echo "排序后新的数组的顺序为:${arr[*]}"
}
maopao $arr #调用函数
#去重
arr=($(awk -v RS=' ' '!a[$1]++' <<< ${arr[@]}))
echo "去重后:"${arr[@]}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、假设 file.txt 内容如下,请在grep,egrep,sed,awk中至少2种命令输出有效的号码:987 456-1230和(123) 456-7890,要求至少要有一种方法使用正则表达式匹配完整的号码。(10分)

cat file.txt
987-123-5430
987 456-1230
(123) 456-7890

算法思路

前三位以1-9数字开头,有或没有()

空格

三位数字456

-

0-9的四位数字
[root@localhost ~]# egrep "^(\(?[0-9]{3}\)?)[ ][456]{3}[-][0-9]{4}$" file.txt
987 456-1230
(123) 456-7890

[root@localhost ~]# awk '/^(\(?[0-9]{3}\)?)[ ][456]{3}[-][0-9]{4}$/{print}' file.txt
987 456-1230
(123) 456-7890

在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值