勿知勿畏

Shell介绍(二)函数,数组

2019-09-08 20:19:34
函数
命令的集合 完成特定功能的代码块
模块化 复用
函数和变量类似 只有先定义才可以调用,如果只定义不调用 则不会执行
函数的定义和调用
三种方法:
[root@web scripts]# cat fun.sh
#!/bin/sh
test1(){
    echo "第一种函数定义方式"
}
function test2(){
    echo "第二种函数定义方式"
}
function test3 {
    echo "第三种函数定义方式"
}
test1
test2
test3


函数的传参 不能直接传参


1. 在函数名的后面跟参数

fun(){
    if [ -f $1 ];then
        echo "$1 is exsis"
    else
        echo "$1 is no ex"
    fi
}
fun $1


2. 全局配置 在函数的最上面 设置变量

[root@web scripts]# cat fun1.sh
#!/bin/sh
num=20
fun(){
for i in `seq $1`
do
    sum=$[num+i]
done
    echo $sum
}
fun $1


3. local 只在函数体内部生效

[root@web scripts]# cat fun1.sh
#!/bin/sh
fun(){
num=20
for i in `seq $1`
do
    sum=$[num+i]
done
    echo $sum
}
fun $1
数组
普通数组  只能以数字作为索引(下标)
关联数组  可以使用数字也可以使用字符串作为索引(下标)
数组名[索引]=值


定义普通数组


第一种定义方式

数组名[索引]=值
[root@web scripts]# array[0]=shell
[root@web scripts]# array[1]=Linux
[root@web scripts]# array[2]=MySQL
第二种定义方式 一次定义多个值
数组名=(值)
[root@web02 ~]# array=(shell mysql [20]=kvm [50]=test)
[root@web02 ~]# echo ${array[*]}
shell mysql kvm test
[root@web02 ~]# echo ${!array[*]}
0 1 20 50


如何查看值 查看某个索引的值

[root@web scripts]# echo ${array[2]}
MySQL
[root@web scripts]# echo ${array[1]}
Linux
[root@web scripts]# echo ${array[0]}
shell


查看所有的值

[root@web scripts]# echo ${array[*]}
shell Linux MySQL
[root@web scripts]# echo ${array[@]}
shell Linux MySQL


如何查看索引

[root@web scripts]# echo ${!array[*]}
0 1 2
[root@web scripts]# echo ${!arraytest[*]}
0 1 2 3 4
[root@web scripts]# echo ${arraytest[*]}
shell Linux Mysql kvm docker


案例: ping数组内的ip

[root@web scripts]# cat array.sh
#!/bin/sh
ip=(
10.0.0.7
10.0.0.8
10.0.0.254
10.0.0.1
)

for i in ${!ip[*]}
do
    ping -c 1 -W 1 ${ip[$i]}
done


普通数组

[root@web02 ~]# array[index1]=Shell
[root@web02 ~]# array[index2]=Linux
[root@web02 ~]# array[index3]=MySQL
[root@web02 ~]# echo ${array[*]}
MySQL
[root@web02 ~]# echo ${array[1]}

[root@web02 ~]# echo ${array[2]}

[root@web02 ~]# echo ${array[3]}

[root@web02 ~]# echo ${array[0]}
MySQL


如何定义关联数组

declare -A array
[root@web02 ~]# declare -A array
[root@web02 ~]# array[index1]=Shell
[root@web02 ~]# array[index2]=Linux
[root@web02 ~]# array[index3]=MySQL
[root@web02 ~]# echo ${array[index1]}
Shell
[root@web02 ~]# echo ${array[index2]}
Linux
[root@web02 ~]# echo ${array[index3]}
MySQL
[root@web02 ~]# echo ${array[*]}
Shell Linux MySQL
[root@web02 ~]# echo ${!array[*]}
index1 index2 index3


查看数组的长度

echo ${#array[*]}


遍历数组 三种方式

1. echo ${array[*]}   for循环
2. echo ${!array[*]}  使用索引遍历内容
3. echo ${#array[*]}  索引的个数遍历内容
[root@web02 ~]# let array[a]++
[root@web02 ~]# let array[a]++
[root@web02 ~]# let array[a]++
[root@web02 ~]# let array[a]++
[root@web02 ~]# let a++
[root@web02 ~]# let a++
[root@web02 ~]# echo $a
2
[root@web02 ~]# let b++
[root@web02 ~]# let b++
[root@web02 ~]# echo $b
2
[root@web02 ~]# let array[b]++
[root@web02 ~]# let array[b]++
[root@web02 ~]# let array[b]++
[root@web02 ~]# echo ${array[b]}
[root@web02 ~]# cat array.sh
#!/bin/sh
declare -A array
for i in `cat sex.txt`
do
    let array[$i]++
done
for i in ${!array[*]}
do
    echo "$i出现了 ${array[$i]}次"
done
案例2:
[root@web02 ~]# cat sex.txt
zs m
ls m
em f
alex m
ld m
oldboy f
bgx x
[root@web02 ~]# cat array.sh 
#!/bin/sh
declare -A array
while read line
do
    type=`echo $line|awk '{print $2}'`
    let array[$type]++
done<sex.txt
for i in ${!array[*]}
do
    echo "$i出现了 ${array[$i]}次"
done


案例3

[root@web02 ~]# cat array.sh 
#!/bin/sh
declare -A array
while read line
do
    let array[`echo $line|awk '{print $2}'`]++
done<sex.txt
for i in ${!array[*]}
do
    echo "$i出现了 ${array[$i]}次"
done

统计IP地址
[root@web02 ~]# cat array.sh
#!/bin/sh
declare -A array
while read line
do
    type=`echo $line|awk '{print $1}'`
    let array[$type]++
done</var/log/nginx/access.log
for i in ${!array[*]}
do
    echo "$i出现了 ${array[$i]}次"
done


作者:无知勿畏 分类:linux基础 浏览:1050 评论:0
控制面板
您好,欢迎到访网站!
  查看权限
搜索
你好,朋友
真是美好的一天!
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
网站分类
站点信息
  • 文章总数:90
  • 页面总数:0
  • 分类总数:9
  • 标签总数:0
  • 评论总数:0
  • 浏览总数:119133