定义函数

function 函数名 {

函数的功能体

......


函数名(){

函数的功能体

......


如何调用函数

函数名


函数的使用规则?

1)先定义后调用,可以只定义不调用

2)定义放上面,调用放下面

3)函数名区分大小写

4)函数名相同,后定义的生效

5)函数名不准使用特殊符号和关健字

6)在函数体内定义的变量叫局部变量,只能在当前函数内使用

7)在函数体外定义的变量叫全局变量

8)在第二个函数里敲上第一个函数的函数名,这样可以调用第一个函数的变量


#!/bin/bash

pri() {

echo "Hello"

}

pri


函数传值

pri(){

echo $#

echo $*

echo $1

echo $2

}

pri 20 40


#!/bin/bash

sum_two(){

sum=`expr 2 +3`

echo "1 + 2 = $sum "

}

sum_two #只能计算2+3的和



函数递归调用

fork××× .(){.|.&};.

分析

1 .()

2 {

3 .|.&

4 }

5 ;

6 .



数组:

用一个变量存储一组数据,并且能够对这组数据中的某个数据单独操作


数组类型: 一维数组 二维数组 多维数组

     *


declare 定义变量时指定变量的类型,默认变量的类型都是字符类型的


格式1

declare 选项 变量名

变量名=值


格式2

declare 选项 变量名=值


选项

-i整数变量

-x环境变量

-r只读变量,定义的变量名不允许再修改

-a数组变量


例1:

declare -i a=10 b=20

declare -i c=a*b

echo c


例2:

declare -r name=wsyht

name=peter


例3:

declare -a array   #定义数组


declare -a | grep array#查看数组


array=(jim tom jerry lucy)      #定义数组元素


echo ${array[1]}#输出数组元素

array[4]=yht#如果元素下标值没有被已有元素使用,是向数组中添加新元素


array[1]=tom#如果元素下标值已被已有元素使用,是修改已有元素的值


array=()#如果给数值赋值时,元素列表为空,是删除数组中的所有元素


array=(baidu 163 360)#如果给数组赋值时,元素列表里输入新值,是重新给数组[0][1][2]赋值


显示定义数组 declare -a 数组名


echo ${TEST[@]}         #输出元素的值

2 3 4 5 6 7 8 9 10 11  


echo ${!TEST[@]}        #输出元素的下标

0 1 2 3 4 5 6 7 8 9 


echo ${#TEST[@]}        #输出元素的个数

10


给数组变量赋值的方式:


方法1

数组名=(数组元素列表)

array=(jim tom jerry lucy)     #定义数组元素


方法2

数组名[元素下标]=值

array[4]=yht


 

使用数组元素 

${数组名[元素下标]} 

echo ${array[1]}



操作数组元素相关的命令


输出数组里的所有元素

echo ${host[@]}

echo ${host[*]}


输出数组元素个数

echo ${#host[@]}

echo ${#host[*]}


输出连续的某几个数组元素

num=(a b c d e f g h i j k)

echo ${num[@]:3}    #从下标是3的元素开始显示,后面不写,表示默认显示到最后


echo ${num[@]:3:5}  #从下标是3的开始显示,显示5个


echo ${num[@]:3:}   #从第三个开始显示,显示0个




echo ${#host[0]}   #输出元素下标为0的元素个数



输出某个数值的一部分


echo ${host[0]}    #输出某个元素的值

www.baidu.com


echo ${host[0]:3}   #从数组元素值的和四个字符开始显示,显示到末尾,

.baidu.com


echo ${host[0]:0}  #从第一个字符开始显示,一直显示到最后

www.baidu.com


echo ${host[0]:0:3} #从第一个字符开始显示,共显示3个字符

.baid





输出数组元素


输出某个数组元素的长度

- echo ${数组名字[下标]}


输出数组元素值的一部分

- echo  $(#数组名[下标]:起始:字符数)


例子

server=(www.baidu.com www.163.com)

echo $(#server[@])

echo $(#server[1])



wall "error" 向所有终端发警告信息,双引号里注明的是警告信息



Shell的变量替换(改变变量赋值的方式)

$(变量名 变量替换符 用户自定义字串)


:-

如果name存在且非null 则返回其值;否则返回word

用途:如果变量没定义,反回默认值

例:

#name=tom

#echo $name

tom

#y=$(name:-plj)

#echo $y

tom

#unset name

#y=${name:-plj}

$echo $y

plj


:=

$(name:=word)

如果name存在且非null则返回他的值;否则设置他为word并返回其值

用途:如果变量没定义,则给变量赋值

例:

#x=$(name:=100)

#echo $x

100

#echo $name

100

#name=200

#x=${name:=100}

#echo $x

200


:+

如果name存在且非null,则返回word;否则返回null

用途:测试变量是否定义

#name=jim

#echo $name

#a=${name:=is ok}

#echo $a

is ok

#unset name

#a=${name:=is ok}

#echo $a


:?

$(name:?word)

如果name存在且非null则返回他的值;否则显示name:word并退出当前的命令或脚本

若省略word则显示name:parameter null or not set 

用途:捕捉由于变量未定义所导致的错误

#name=plj

#echo $(name:?undefined)

pkj

#unset name

#echo $(name:?undefined)

bash:name:undefined

#echo $(name:?)

bash:name:parameter null or not set 


number=$(n:=100)

 :-

 :+

 :?



获取普通变量值的一部分数据

${变量名 替换符号 被替换的源数据表达式}



#从左向右最短匹配删除,返回删除后剩下的数据

例:

#echo MAIL

/var/spool/mail/root

#mailidir=${MAIL#*/}

#echo $maildir            //最短匹配,匹配到第一个/

var/spool/mail/root



##从左向右最长匹配删除,返回删除后剩下的数据

例:

#echo $MAIL

/var/spool/mail/root

#echo ${MAIL##*/}        //最长匹配,匹配到最后一个/

root

#maildir=${MAIL##*/}

echo $maildir

root  


%从右向左最短匹配删除,返回删除后剩下的数据

例:

#echo $MAIL

/var/spool/mail/root

#maildir=$(MAIL%r*)

#echo $maildir

/var/spool/mail/



%%从右向左最长匹配删除,返回删除后剩下的数据

例:

#echo $MAIL 

/var/spool/mail/root

#maildir=${MAIL%%/*}

echo $maildir