shell练习题(3)

wuchangjian2021-11-05 21:28:13编程学习

文章目录

    • 1、编写函数,实现打印绿色OK和红色FAILED 判断是否有参数,存在为Ok,不存在为FAILED
    • 2、编写函数,实现判断是否无位置参数,如无参数,提示错误
    • 3、编写函数实现两个数字做为参数,返回最大值
    • 4、编写函数,实现两个整数位参数,计算加减乘除。
    • 5、将/etc/shadow文件的每一行作为元数赋值给数组
    • 6、使用关联数组统计文件/etc/passwd中用户使用的不同类型shell的数量
    • 7、使用关联数组按扩展名统计指定目录中文件的数量
    • 8、写一个脚本让用户输入多个城市的名字(可以是中文),要求不少于5个,然后把这些城市存到一个数组里,最后用for循环把它们打印出来。
    • 9、生成10 个随机数保存于数组中,并找出其最大值和最小值
    • 10、写一个脚本,定义一个数组,数组中的元素是/var/log 目录下所有以 .log 结尾的文件;要统计其下标为偶数的文件中的行数之和

1、编写函数,实现打印绿色OK和红色FAILED 判断是否有参数,存在为Ok,不存在为FAILED

#! /bin/bash
kk(){
  if  [ $# -ne 0 ]
    then 
      echo -e "\033[32m OK \033[0m"
    else
      echo -e "\033[31m FAILED  \033[0m"
  fi
}

read -p "请输入参数:" num
kk $num

2、编写函数,实现判断是否无位置参数,如无参数,提示错误

#! /bin/bash
kk(){
  if  [ $# -ne 0 ]
    then 
      echo "参数为$num"
    else
      echo "错误:无位置参数"
  fi
}

read -p "请输入参数:" num
kk $num

3、编写函数实现两个数字做为参数,返回最大值

#! /bin/bash
max () {
if [ $a -gt $b ]
then 
  echo "max is $a "
elif [ $b -gt $a ];then
  echo "max is $b "
else
  echo "$a 等于 $b"
fi
}

read -p "请输入两个数字:" a b
[ -z $a ] && echo "输入错误:输入为空" && exit 1
expr $a + 1 &>/dev/null
if [ $? -ne 0 ];then
   echo "输入错误:请输入数字"
   exit 2
fi
[ -z $b ] && echo "输入错误:输入为空" && exit 2
expr $b + 1 &>/dev/null
if [ $? -ne 0 ];then
   echo "输入错误:请输入数字"
   exit 2
else
  max $a $b
fi

4、编写函数,实现两个整数位参数,计算加减乘除。

#! /bin/bash
math (){
  echo "$a+$b="$[$a+$b]
  echo "$a*$b="$[$a*$b]
  echo "$a-$b="$[$a-$b]
  echo "$a/$b="$[$a/$b]
}
read -p "请输入两个数字:" a b
[ -z $a ] && echo "输入错误:输入为空" && exit 1
expr $a + 1 &>/dev/null
if [ $? -ne 0 ];then
   echo "输入错误:请输入数字"
   exit 2
fi
[ -z $b ] && echo "输入错误:输入为空" && exit 2
expr $b + 1 &>/dev/null
if [ $? -ne 0 ];then
   echo "输入错误:请输入数字"
   exit 2
else
  math $a $b
fi

5、将/etc/shadow文件的每一行作为元数赋值给数组

#! /bin/bash
file=/etc/shadow
num=`wc -l < $file`
for i in `seq $num`
do
   arroy[$i]=`head -$i $file | tail -1`
done

for i in ${arroy[*]}
do
  echo $i
done

6、使用关联数组统计文件/etc/passwd中用户使用的不同类型shell的数量

#! /bin/bash
declare -A shells
while read line
do
   type=`echo $line | awk -F: '{print $7}'`
   let shells[$type]++
done < /etc/passwd

for i in ${!shells[*]}
do
   echo "$i 的数量为 ${shells[$i]}"
done

7、使用关联数组按扩展名统计指定目录中文件的数量

#! /bin/bash
read -p "请输入要查看的目录:" path
[ -z $path ]&& echo "输入错误:输入为空" && exit 1
cd $path
for i in `ls`
do
        if [ -d $i ]; then
          echo $i >>/tmp/ceshi.txt
        fi
done
declare -A arroy
a=0
while read line
do
  let arroy[$a]++
done </tmp/ceshi.txt
b=0
for b in ${!arroy[*]}
do
   echo "目录文件共有: ${arroy[$b]}"
done
rm -rf /tmp/ceshi.txt 

8、写一个脚本让用户输入多个城市的名字(可以是中文),要求不少于5个,然后把这些城市存到一个数组里,最后用for循环把它们打印出来。

#! /bin/bash
read -a city -p "请输入不少于5个城市名称,以空格作为分隔符:"
if [ ${#city[*]} -lt 5 ];then
        echo "输入有误,请输入不少于5个"
        exit 1
fi

for i in ${city[*]}
do
        echo $i
done
或者使用以下循环方法
for ((i=0;i<${#city[@]};i++))
do
        echo ${city[i]}
done

9、生成10 个随机数保存于数组中,并找出其最大值和最小值

#! /bin/bash
for i in `seq 0 9`
do
        array[$i]=$RANDOM
done

MAX=${array[0]}
MIN=${array[0]}

for i in ${array[*]}
do
        [ $i -lt $MIN ]&& MIN=$i
        [ $i -gt $MAX ]&& MAX=$i
done

echo ${array[*]}
echo "最大值为:$MAX"
echo "最小值为:$MIN"

10、写一个脚本,定义一个数组,数组中的元素是/var/log 目录下所有以 .log 结尾的文件;要统计其下标为偶数的文件中的行数之和

#! /bin/bash
file=(`find /var/log -name "*.log" -type f`)

for((i=0;i<${#file[*]};i++))
do
     if [ $(($i%2)) -eq 0 ];then
        let line+=$(wc -l <${file[$i]})
     fi
done
echo "Lines:$line"

相关文章

Vue路由守卫有哪些,怎么设置,使用场景等

vue中路由守卫一共有三种,一个全局路由守卫,一个是组件内路...

HCIP 2

HCIP 2

实验拓扑图如上所示   要求: 1.R4为运营商,...

U-Mail邮件网关智能DNS技术,解决海外邮件接收问题

U-Mail邮件网关智能DNS技术,解决海外邮件接收问题

随着中国企业的逐步发展,许多企业逐步扩展海外业务,需要与海外...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。