shell脚本函数

1.函数的作用:

1.函数是命令的集合 是一个完成特定功能的代码块
函数是使用一个名称 来定义一堆命令
2.函数便于复用 可以在任意的shell中调用函数 类似functions
3.函数类似变量 只能先定义 在调用 如果不调用则不会执行  shell中只要定义了就会执行
1)函数的传参
2)函数的本地变量
3)函数的返回值

2.定义函数的三种方法

#!/bin/bash
fun1(){
     echo "第一种定义函数的方法"
}

function fun2 {
     echo "第二种定义函数的方法"
}
function fun3(){
     echo "第三种定义函数的方法"
}
#调用函数直接写函数名称即可 必须先定义在调用
fun1
fun2
fun3
2.1其他脚本中调用
root@shell /server/scripts/day5]# cat test.sh
#!/bin/sh
. ./fun.sh
fun1
echo done................
[root@shell /server/scripts/day5]# sh test.sh
第一种定义函数的方法
done................
2.2举例
[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
     if [ -f $1 ];then
        echo "$1 存在"
     else
    echo "$1 不存在"
     fi
}
fun /etc/passwd
[root@shell /server/scripts/day5]# sh fun.sh
/etc/passwd 存在

[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
     if [ -f $2 ];then
        echo "$2 存在"
     else
    echo "$2 不存在"
     fi
}
fun /etc/passwd /etc/hosts
[root@shell /server/scripts/day5]# sh fun.sh
/etc/hosts 存在
2.3函数的脚本传参
[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
     if [ -f $1 ];then
        echo "$1 存在"
     else
    echo "$1 不存在"
     fi
}
fun $1
[root@shell /server/scripts/day5]# sh fun.sh /etc/passwd
/etc/passwd 存在
[root@shell /server/scripts/day5]# sh fun.sh /etc/passwddddd
/etc/passwddddd 不存在

[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
     if [ -f $1 ];then
        echo "$1 存在"
     else
    echo "$1 不存在"
     fi
}
fun $2 $1
[root@shell /server/scripts/day5]# sh fun.sh /etc/hosts /etc/passwd
/etc/passwd 存在
2.4赋值
#!/bin/bash
num=10
fun(){
     for i in `seq 10`
     do
           total=$[$num+$i]
           total=10+1
           total=11
           total=10+2
           total=12
           total=10+3
           total=13

           total=$[$total+$i]

     done
     echo 计算结果为 $total
}
fun


[root@shell /server/scripts/day5]# cat fun.sh 
#!/bin/bash
num=10
fun(){
     for i in `seq 10`
     do
           total=$[$num+$i]
     done
     echo 计算结果为 $total
}
fun
[root@shell /server/scripts/day5]# sh fun.sh
计算结果为 20

[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
     for i in `seq 10`
     do
           total=$[$1+$i]
     done
     echo 计算结果为 $total
}
fun $3
fun $2
fun $1
[root@shell /server/scripts/day5]# sh fun.sh 10 20 30
计算结果为 40
计算结果为 30
计算结果为 20
2.5只在当前的fun函数生效
函数的本地变量 local
[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
local num=10                # 只在当前的fun函数中生效
     for i in `seq 10`
     do
           total=$[$num+$i]
     done
     echo 计算结果为 $total
}
fun
echo $num
[root@shell /server/scripts/day5]# sh fun.sh
计算结果为 20

3.函数返回值 return

[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
  echo 100
  return 1
}
result=`fun`
echo "当前函数的返回值是: " $?
echo "当前函数的直接结果是: " $result
[root@shell /server/scripts/day5]# sh fun.sh
当前函数的返回值是:  1
当前函数的直接结果是:  100

[root@shell /server/scripts/day5]# cat fun.sh
#!/bin/bash
fun(){
  echo 100
  return 1
}
fun
echo "当前函数的返回值是: " $?
echo "当前函数的直接结果是: " $result
[root@shell /server/scripts/day5]# sh fun.sh
100
当前函数的返回值是:  1
当前函数的直接结果是: 
3.1案例: 使用返回值来判断文件是否存在
[root@shell /server/scripts/day5]# sh fun.sh /etc/passwd
[root@shell /server/scripts/day5]# echo $?
50
[root@shell /server/scripts/day5]# cat fun.sh 
#!/bin/bash
fun(){ 
     if [ -f $1  ];then
        return 50
     else
        return 100
     fi 
}
fun $1
[root@shell /server/scripts/day5]# sh fun.sh /etc/passwdddddddddddddd
[root@shell /server/scripts/day5]# echo $?
100

result=$?
if [ $result -eq 50 ];then
     echo "$1 文件存在"
elif [ $result -eq 100  ];then
     echo "$1 文件不存在"
fi

fun $1
case $? in
         50)
       echo "$1 文件存在"
         ;;
     100)
      echo "$1 文件不存在"
     ;;
    *)
         echo USAGE
esac

4.数组

普通数组

关联数组
4.1普通数组
数组语法结构:
变量=值
礼盒=一个水果
礼盒=苹果  礼盒=梨子 礼盒=香蕉 礼盒=茄子

数组=多个值
数组名称[索引名称]=值     索引名称默认从0开始  索引就是值的编号 索引也称为下标
框子[礼盒1]=苹果
框子[礼盒2]=梨
框子[礼盒3]=黄瓜
4.2普通数组的定义方式
第一种:

[root@shell ~]# array[1]=shell
[root@shell ~]# array[2]=mysql
[root@shell ~]# array[3]=docker

第二种定义方式  使用默认方式定义多个值  常用的定义方式
array=(shell mysql docker)
array=(10.0.0.1 10.0.0.2 10.0.0.7 10.0.0.61)

第三种定义 混合定义
array=(shell mysql [5]=docker [10]=kvm)

第四种定义 命令
array=(`ls`)
[root@shell /opt]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 30 11:04 1.txt
-rw-r--r-- 1 root root 0 Jun 30 11:04 2.txt
-rw-r--r-- 1 root root 0 Jun 30 11:04 3.txt
declare -a array='([0]="1.txt" [1]="2.txt" [2]="3.txt")'
4.3如何查看数组
如何查看数组
declare -a   # 在内存中定义的数组

取消数组
unset array


查看数组中的值
[root@shell ~]# array=(mysql docker shell)
[root@shell ~]# 
[root@shell ~]# echo ${array[*]}
mysql docker shell
[root@shell ~]# echo ${array[@]}
mysql docker shell

查看某个索引中的值
[root@shell ~]# echo ${array[2]}
shell
[root@shell ~]# 
[root@shell ~]# echo ${array[0]}
mysql
[root@shell ~]# echo ${array[1]}
docker

查看数组的索引
[root@shell ~]# echo ${!array[*]}
0 1 2
查看总共的索引数量
[root@shell ~]# echo ${#array[*]}
3
案例
[root@shell ~]# array=(10.0.0.1 10.0.0.2 10.0.0.7)
[root@shell ~]# echo ${array[*]}
10.0.0.1 10.0.0.2 10.0.0.7
[root@shell ~]# 
[root@shell ~]# 
[root@shell ~]# echo ${array[*]}
10.0.0.1 10.0.0.2 10.0.0.7
[root@shell ~]# 
[root@shell ~]# 
[root@shell ~]# for i in ${array[*]};do echo $i;done
10.0.0.1
10.0.0.2
10.0.0.7
[root@shell ~]# for i in ${array[*]};do ping -c1 -W1 $i;done

[root@shell /server/scripts/day5]# cat array.sh
#!/bin/sh
ip=(
10.0.0.1
10.0.0.2
10.0.0.7
)
for i in ${ip[*]}
do
     ping -c1 -W1 $i &>/dev/null
     [ $? -eq 0 ] && echo "$i 是通的"
done

[root@shell /server/scripts/day5]# sh array.sh
10.0.0.1 是通的
10.0.0.2 是通的
10.0.0.7 是通的


使用下标遍历数组
[root@shell /server/scripts/day5]# cat array.sh
#!/bin/sh
ip=(
10.0.0.1
10.0.0.2
10.0.0.7
)
for i in ${!ip[*]}
do
    ping -c1 -W1 ${ip[$i]} &>/dev/null
    [ $? -eq 0 ] && echo "${ip[$i]} 是通的"
done

[root@shell /server/scripts/day5]# sh array.sh
10.0.0.1 是通的
10.0.0.2 是通的
10.0.0.7 是通的
4.4关联数组:
关联数组和普通数组的区别
普通数组只能使用数字作为索引
关联数组可以使用字符串作为索引
定义方式和普通数组相同 不同是要声明关联数组
必须先声明为关联数组
[root@shell ~]# declare -A array
[root@shell ~]# array[index1]=shell
[root@shell ~]# array[index2]=mysql
[root@shell ~]# array[index3]=docker
[root@shell ~]# echo ${array[*]}
shell mysql docker
[root@shell ~]# echo ${!array[*]}
index1 index2 index3
去大保健找了几个妹子 妹子每天服务次数不同 问每个妹子每天服务了多少次!
小红
小红
小紫
小绿
小紫
小兰

直接运算
let 小红++
let 小红++
let 小紫++

echo $小红 === 2次

第一步: 上面的人名 对应了数组的索引
我们去的是红浪漫的场地
红浪漫[0]=小红
红浪漫[1]=小紫
红浪漫[2]=小绿
红浪漫[3]=小兰


#!/bin/sh
declare -A honglangman
for i in `cat honglang.txt`
do
     let honglangman{$i}++
     let honglangman{小红}++
     let honglangman{小紫}++
     let honglangman{小绿}++
done
for i in ${!honglangman[*]}  #查看红浪漫里面总共多少个姑娘 每个姑娘的名字
do
     echo $i
done



[root@shell ~]# cat honglang.sh
#!/bin/sh
declare -A honglangman
for i in `cat honglang.txt`
do
     let honglangman[$i]++
done
for i in ${!honglangman[*]}  #查看红浪漫里面总共多少个姑娘 每个姑娘的名字
do
     echo $i 出现了 ${honglangman[$i]} 次
done
[root@shell ~]# sh honglang.sh
小兰 出现了 1 次
小紫 出现了 2 次
小绿 出现了 1 次
小红 出现了 3 次
[root@shell ~]# cat honglang.txt 
小红
小红
小紫
小绿
小紫
小兰
小红
统计web的服务器IP地址出现的次数

[root@shell ~]# cat for.sh
#!/bin/sh
declare -A array
while read line
do
       ip=`echo $line|awk '{print $1}'`
       let array[$ip]++


done</var/log/nginx/access.log
for i in ${!array[*]}
do
    echo $i 出现了 ${array[$i]} 次
done

[root@shell ~]# cat for.sh 
#!/bin/sh
declare -A array
while read line
do
       ip=`echo $line|awk '{print $1}'`
       let array[$ip]++


done</var/log/nginx/access.log
for i in ${!array[*]}
do
    echo $i 出现了 ${array[$i]} 次
done

[root@shell ~]# sh for.sh 
172.16.1.61 出现了 51 次
127.0.0.1 出现了 998 次
10.0.0.61 出现了 100 次
取出随机数的对应的数字
echo $RANDOM|md5sum|cut -c1-8
cf7e5204 81acd18d 19eb7c1e f519ac25 3c87c04a   52867e9 27bee3b

1232 f519ac25
6166 19eb7c1e
7186 27bee3b8
9746 cf7e5204
11411 81acd18d

[root@shell ~]# cat for.sh
#!/bin/sh
for i in `echo {0..32767}`
do
        ran=`echo $i|md5sum|cut -c1-8`
    if [[ "$ran" =~ "cf7e5204" || "$ran" =~ "81acd18d" || "$ran" =~ "19eb7c1e" || "$ran" =~ "52867e9" || "$ran" =~ "27bee3b" || "$ran" =~ "f519ac25" || "$ran" =~ "3c87c04a" ]];then
    echo $i  $ran
    fi
done
输入姓名 抓阄1-100随机生成数
[root@shell ~]# cat ran.sh
#!/bin/sh
> z.txt
echo "抓阄开始小板凳准备好"
while true
do
    read -p "请输入你的姓名: " name
        if [ $name = "exit" ];then
           clear
           echo "抓阄结束排名如下"
           cat z.txt|sort -rnk 3|head
           exit
        fi
           while true
           do
          ran=`echo $((RANDOM%100+1))`
          if [ `cat z.txt|grep -w $ran|wc -l` -eq 1 ];then
             continue
          else
             break
          fi
           done
    echo "$name 幸运号码 $ran"|tee -a z.txt
done
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容