当前位置:首页 > linux基础 > 正文内容

Shell介绍(二)函数,数组

6年前 (2019-09-08)linux基础836
函数
命令的集合 完成特定功能的代码块
模块化 复用
函数和变量类似 只有先定义才可以调用,如果只定义不调用 则不会执行
函数的定义和调用
三种方法:
[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


“Shell介绍(二)函数,数组” 的相关文章

rpm包管理

rpm包管理

RPM基础概述RPM全称RPM Package Manager缩写,由红帽开发用于软件包的安装,升级卸载与查询rpm包的命名规则一个rpm软件包的命名规则。bash-4.2.46-28.el7.x86_64.rpmname: 软件包名称version: 版本号, 主版本, 重大更新. 次版本, 子...

crond计划任务

crond计划任务1.什么是crondcrond就是计划任务,类似于我们平时生活中的闹钟。定点执行。2.为什么要使用crondcrond主要是做一些周期性的任务,比如: 凌晨3点定时备份数据。比如:11点开启网站抢购接口,12点关闭网站抢购接口。3.计划任务主要分为以下两种使用情况:1.系统级别的定...

sersync实时同步

sersync实时同步

实时同步概述实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。保证数据的连续性, 减少人力维护成本,解决nfs单点故障实时同步工具选择sersync+rsync(√)、inotify+rsyncInotify是一个通知接口,用来监控文件系统的各种变化,如果...

Rsync文件同步

Rsync文件同步

Rsync基本概述rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows等多种操作系统平台。Rsync简介rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有...

Linux文件管理-压缩打包

压缩打包介绍windows下我们接触最多的压缩文件就是.rar格式, 但Linux有自己所特有的压缩工具。如果希望windows和Linux互相能使用的压缩工具, 建议.zip格式压缩的好处主要有:1、节省磁盘空间占用率2、节省网络传输带宽消耗3、网络传输更加快捷Linux系统常见的压缩包有哪些类型...