shell的灵活运用 (函数,关联数组,循环,awk,sed等)

题目

提示:没有基础请先看看基础部分的讲解,否则看不懂

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

代码:

#bash/bin
function a() {
        b=$#   #判断传入的参数个数
#       echo $b
        if [ $b -eq 0 ]   # 看参数个数是不是等于0 
        then
                echo "no"
        else
                echo "yes"
        fi
}
a

1,当不传入参数时,结果为:

no

2,当传入参数时,结果为:

yes

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

代码

function a() {    # 定义函数
        num1=$1   # 获取第一个参数
#       echo "num1:$num1"
        num2=$2
#       echo "num2:$num2"
        if [ $num1 -gt $num2 ]     # 2个参数进行比较
        then
                echo "$num1"    # 返回第一个参数
        else
                echo "$num2"   # 返回得第二个参数
        fi
}
c=$(a 200 300)     # 传入2个参数,并且将返回值赋值给c
echo "the $c is more big"

运行输出结果:

[root@localhost ~]# bash functiontest.sh 
the num1:200
num2:300
300 is more big

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

代码

a(){
        one=$1
        two=$2
        echo  "$one + $two = `expr $one + $two`"
        echo  "$one - $two = `expr $one - $two`"
        echo  "$one * $two = `expr $one \* $two`"
        echo  "$one / $two = `expr $one / $two`"
        printf  "$one / $two = `expr $one / $two`\n"

}
a 2 3

运行结果

[root@localhost ~]# bash functiontest.sh 
2 + 3 = 5
2 - 3 = -1
2 * 3 = 6
2 / 3 = 0
2 / 3 = 0

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

代码

function a(){
        a=`wc -l /etc/shadow | cut -d" " -f1`   # 将目标文件进行剪切,提取需要的数据,这里代表数据个数
for i in `seq $a`
do
        b=`expr $i - 1`     # 数组下标
        arr[$b]=`awk 'NR=='$i'{print}' /etc/shadow`    # 将对应的哪一行数据放入到数组
done
}
a
echo ${arr[0]}     # 打印数组的第一个元素
echo ${arr[1]}    #第二个
echo ${arr[2]}
echo ${arr[3]}

以上的结果显示为: 结果的验证可以用cat 命令对目标文件进行对比

[root@localhost ~]# bash functiontest.sh 
root:$6$SqQF33Q5poRxzqNJ$mAZ7EJuymCGVS6HxSAinq4danhF48kUbkyg/Kck3VJ8mIO5tDJlrsbQ04.aXbUb63rif82rIR/Xuatvcdj6Bp1::0:99999:7:::
bin:*:19121:0:99999:7:::
daemon:*:19121:0:99999:7:::
adm:*:19121:0:99999:7:::

5,使用关联数组统计文件/etc/passwd中各个用户的shell类型

代码

function a(){
        read -p "which user's shell type that you want find?:" shell_type  # 提示加读取输入的变量
        declare -A arry    # 必须声明关联数组
        l=`wc -l /etc/passwd | cut -d " " -f1`   # 计算数据的条数
        for i in `seq $l`
        do
#               ass-arry[`expr $i - 0`] 
                index=`cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1}' | awk  'NR=='$i'{print}'`  # 关联数组的下标
        #       echo "index $index"
                declare -A arry
                arry["$index"]=`cat /etc/passwd | awk 'BEGIN{FS=":"}{print $7}' | awk 'NR=='$i'{print}'`  # 关联数组的值
        done
        echo "the user $shell_type's shell type is ${arry[$shell_type]}"   # 格式化输出
}
a

运行的结果:

[root@localhost ~]# bash functiontest.sh 
which user's shell type that you want find?:fu
the user fu's shell type is /bin/bash

[root@localhost ~]# bash functiontest.sh 
which user's shell type that you want find?:root
the user root's shell type is /bin/bash

[root@localhost ~]# bash functiontest.sh 
which user's shell type that you want find?:bin
the user bin's shell type is /sbin/nologin

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

代码

function a() {
        read -p "input a file path (absolute):(such as input /etc/)>" path  # 输入路径
        read -p "which type of file are you count ?:(such as input txt or sh ...)>" type1  # 输入文件类型
        a=`ls -l $path | awk '{print $9}' | grep '^[^$]' | awk 'BEGIN{FS="."}{print $2}'`   # 看有几个文件有后缀名
        declare -A arr
        for i in $a
        do
       #         echo "file type: $i"
                arr["$i"]=`expr ${arr["$i"]} + 1`   # 对文件类型计数表示该类型文件个数
        done
        echo "the file of type $type1 have ${arr[$type1]}"
}
a

运行结果如下:结果的验证可以用自己数

[root@localhost ~]# bash functiontest.sh 
input a file path (absolute):(such as input /etc/)>/etc/
which type of file are you count ?:(such as input txt or sh ...)>conf
the file of type conf have 36

[root@localhost ~]# bash functiontest.sh 
input a file path (absolute):(such as input /etc/)>/etc/
which type of file are you count ?:(such as input txt or sh ...)>d
the file of type d have 24

7,编写函数 ,判断是否有参数,存在为Ok,不存在为FAILED,要求绿色OK和红色FAILED

代码:

function a() {
       b=$#
##      echo $b
       if [ $b -eq 0 ]
       then
               echo -e "\e[31m failde \e[0m";

       else
               echo -e "\e[32m ok \e[0m";
       fi
}
a 1

你可能感兴趣的:(bash,linux,开发语言)