定义函数
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 数组名
给数组变量赋值的方式:
方法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