Shell函数数组练习
1、编写函数,实现打印绿色OK和红色FAILED,判断是否有参数,存在为Ok,不存在为FAILED
[root@shell ~]# vim ok.sh +
#!/bin/bash
read -p "请输入一个参数:" i ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
function ok_failed() { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? if [ -z "$i" ]; then ? ? ? ?#-z为检查字符串长度是否为空,也可以用[ $# -eq 0 ]
? ? ? ? echo -e "\033[31mFAILED\033[0m" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? else ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? echo -e "\033[32mOK\033[0m" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? fi ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
ok_failed ? ? ? ? ? ? ? ? ? ? ? #若用[ $# -eq 0 ]这里调用函数需要加参数$i?[root@shell ~]# sh ok.sh 1
请输入一个参数:1
OK
[root@shell ~]# sh ok.sh 1
请输入一个参数:
FAILED
2、编写函数,实现判断是否无位置参数,如无参数,提示错误
[root@shell ~]# vim test_weizhi.sh +
#!/bin/bash
read -p "请输入参数,若不要参数直接回车:" i
function test_weizhi() {
? ? ? ? if [ $# -eq 0 ];then
? ? ? ? ? ? ? ? echo "Error无参数"
? ? ? ? else
? ? ? ? ? ? ? ? echo "输入的了$#个参数"
? ? ? ? fi
}
test_weizhi $i[root@shell ~]# sh test_weizhi.sh?
请输入参数,若不要参数直接回车:1 2 3 4?
输入的了4个参数
[root@shell ~]# sh test_weizhi.sh?
请输入参数,若不要参数直接回车:
Error无参数
3、编写函数实现两个数字做为参数,返回最大值
方法一:
[root@shell ~]# vim max_value.sh +
#!/bin/bash
read -p "请输入两个数字:" num1 num2
function max_value() {
? ? ? ? if [ $num1 -gt $num2 ];then
? ? ? ? ? ? ? ? echo "最大值为$num1"
? ? ? ? elif [ $num1 -eq $num2 ];then
? ? ? ? ? ? ? ? echo "两个参数相等"
? ? ? ? else
? ? ? ? ? ? ? ? echo "最大值为$num2"
? ? ? ? fi
}
max_value $num1 $num2[root@shell ~]# sh max_value.sh?
请输入两个数字:1 1
两个参数相等
[root@shell ~]# sh max_value.sh?
请输入两个数字:1 2
最大值为2
[root@shell ~]# sh max_value.sh?
请输入两个数字:3 2
最大值为3
方法二:
方法一过于简单而且bug太多,咱还是要谨慎点,上点难度
[root@shell ~]# vim max_value2.sh +
#!/bin/bash
read -p "请输入两个参数:" -a num ? ? ? ?#-a为指定变量类型为数组
function max_value2() {
? ? ? ? if ! [ ${#num[@]} -eq 2 ];then
? ? ? ? ? ? ? ? echo "请输入两个参数"
? ? ? ? ? ? ? ? exit 2? ? ? ? ? ? ? ? ? ? ? ? ? ?????????#如输入的参数不等于2,则退出脚本
? ? ? ? fi
for i in ${num[@]} ? ? ? ? ? ? ? ? ? ? ?????????#使用for循环遍历num数组?
do
? ? ? ? if [[ ! $i =~ ^[0-9]+$ ]];then ?????????#变量i匹配使用正则表达式匹配是否为数字
? ? ? ? ? ? ? ? echo "请输入纯数字"
? ? ? ? ? ? ? ? exit 2
? ? ? ? fi
done
? ? ? ? if [ ${num[0]} -eq ${num[1]} ];then
? ? ? ? ? ? ? ? echo "请输入两个不同的数字"
? ? ? ? ? ? ? ? exit 2
? ? ? ? fi
max=${num[0]} ? ? ? ? ? ? ? ? ? ? ? ? ? #定义最大值的初始值,一般都定义为第一个元素,以第一个元素为基准依次和其它元素比较找到最大值
for i in ${num[@]}
do
? ? ? ? if [ $i -gt $max ];then
? ? ? ? ? ? ? ? max=$i
? ? ? ? fi
done
echo "最大值为$max"
}
max_value2[root@shell ~]# sh max_value2.sh
请输入两个参数:1 2 3
请输入两个参数
[root@shell ~]# sh max_value2.sh
请输入两个参数:a 2
请输入纯数字
[root@shell ~]# sh max_value2.sh
请输入两个参数:1 1
请输入两个不同的数字
[root@shell ~]# sh max_value2.sh
请输入两个参数:1 2
最大值为2
[root@shell ~]# sh max_value2.sh
请输入两个参数:3 2
最大值为3
4、编写函数,实现两个整数位参数,计算加减乘除。
方法一:
[root@shell ~]# vim ?calculate.sh +
#!/bin/bash
read -p "请输入两个参数:" i v
function calculate() {
? ? ? ? echo "$i+$v=$((i+v))"
? ? ? ? echo "$i-$v=$((i-v))"
? ? ? ? echo "$i*$v=$((i*v))"
? ? ? ? echo "$i÷$v=$((i/v))"
}
calculate[root@shell ~]# sh calculate.sh
请输入两个参数:4 2?
4+2=6
4-2=2
4*2=8
4÷2=2
方法二:
方法一为超级简化版,咱还是上点难度吧,用if条件判断吧!(也可以用case这里就懒得写了都差不多)
[root@shell ~]# vim ?calculate2.sh +
#!/bin/bash
read -p "请输入运算符:" a
read -p "请输入第一个整数:" i
read -p "请输入第二个整数:" v
?
function calculate2() {
? ? ? ? if [ "$a" = "+" ];then
? ? ? ? ? ? ? ? echo "$i+$v=$((i+v))"
? ? ? ? elif [ "$a" = "-" ];then
? ? ? ? ? ? ? ? echo "$i-$v=$((i-v))"
? ? ? ? elif [ "$a" = "*" ];then
? ? ? ? ? ? ? ? echo "$i*$v=$((i*v))"
? ? ? ? elif [ "$a" = "/" ];then
? ? ? ? ? ? ? ? echo "$i÷$v=$((i/v))"
? ? ? ? else
? ? ? ? ? ? ? ? echo "请输入合法与算法符"
? ? ? ? fi
}
calculate2[root@shell ~]# sh calculate2.sh +
请输入运算符:+
请输入第一个整数:4
请输入第二个整数:7
4+7=11
[root@shell ~]# sh calculate2.sh +
请输入运算符:-
请输入第一个整数:6
请输入第二个整数:3
6-3=3
[root@shell ~]# sh calculate2.sh +
请输入运算符:*
请输入第一个整数:4
请输入第二个整数:3
4*3=12
[root@shell ~]# sh calculate2.sh +
请输入运算符:/
请输入第一个整数:6
请输入第二个整数:2
6÷2=3
[root@shell ~]# sh calculate2.sh +
请输入运算符:&
请输入第一个整数:3
请输入第二个整数:3
请输入合法与算法符
5、将/etc/shadow文件的每一行作为元数赋值给数组
[root@shell ~]# vim?shadow.sh +
#!/bin/bash
function shadow() { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? declare -A arry_shadow ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? while read line
? ? ? ? do ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? arry_shadow+=([$line]=$line) ? ?#将当前行的内容作为关联数组arry_shadow的键和值
? ? ? ? done < /etc/shadow ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? for key in "${!arry_shadow[@]}" ? ? ? ? #!为返回对应的键值
? ? ? ? do ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? echo "${arry_shadow[$key]}" ? ? ? ? ? ??
? ? ? ? done ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
} ? ? ? ?line=1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
shadow?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??[root@shell ~]# sh shadow.sh?
6、使用关联数组统计文件/etc/passwd中用户使用的不同类型shell的数量
[root@shell ~]# awk -F: '{count[$NF]++} END{for (shell in count) print count[shell], shell}' /etc/passwd | sort -n
1 /bin/sync
1 /sbin/halt
1 /sbin/shutdown
2 /usr/sbin/nologin
3 /bin/bash
32 /sbin/nologin这里count[$NF]++定义一个关联数字,元素出现次数进行累加,最后使用for循环遍历count数组,打印元素出现的次数和其元素?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!