目录
一.shell函数
1.什么是shell函数
将命令序列按格式写在一起
可方便重复使用命令序列
2.shell函数的格式
function 函数名{
命令序列
}
或
函数名() {
命令序列
}
例:
3.函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余
#!/bin/bash
function db1 {
read -p "请输入: " value
return $[$value * 2]
}
db1
echo $?
4.函数的传参
#!/bin/bash
sum1() {
sum=$[$1 + $2]
echo $sum
}
read -p "输入第一个参数:" first
read -p "输入第二个参数:" second
sum1 $first $second
res=$(sum1)
echo $res
5.函数变量的作用范围
函数在shell脚本中仅在当前shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
#!/binbash
myfun() {
local i
i=2
echo $i
}
i=3
myfun
echo $i
6.递归
函数调用自己本身的函数
#!/bin/bash
fact() {
if [ $1 -eq 1 ];then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
echo $[$1 * $result]
fi
}
read -p "请输入一个阶乘的数字: " n
result=$(fact $n)
echo "阶乘的结果为$result"
7.递归目录
例:
mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件
8.创建库
二.数组
1.定义数组
方法一:
数组名=(value0 value1 value2 …)
方法二:
数组名=([0]=value [1]=value [2]=value …)
方法三:
列表名=“value0 value1 value2 …”
数组名=($列表名)
方法四:
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
数组包括的数据类型
● 数值类型
● 字符类型(字符串)
使用" "或''定义
获取数组长度
读取某个下标赋值
2.数组遍历
3.数组切片
arr=(1 2 3 4 5 6) #定义数组
echo ${arr[*]} #输出整个数组
echo ${arr[@]:0:2} #获取 ${数组名[@或*]:起始位置:长度} 的值
4.数组替换
数组替换
arr=(1 2 3 4 5) #定义数组
echo $ {arr[@]/4/66} #${数组名[@或*]/查找宁符/替换字符}
echo $ {arr[@]} #并不会替换数组原有内容
arr=(${arr[@]/4/66}) #要实现改变原有数组,可通过重新赋值实现
echo $ {arr[@]}
5.数组删除
arr=(1 2 3 4 5)
unset arr #删除数组
echo $ (arr[ * ]}
arr= (1 2 3 4 5)
unset arr[2] #删除第三个元素
echo $ {arr[* ]}
6.数组追加元素
方法一:根据索引单个元素添加
array_name[index]=value
方法二:
array_name[${#array_name[@]}]=value
方法三:
方法三:
array_name=("${#array_name[@]}" value1 value2 ... valueN)
双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个
不能将“@”替换为“*”,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中
方法四:
array_name+=(value1 value2 ... valueN) 注:待添加元素必须用“()”包围起来,并且多个元素用空格分隔
7.向函数传数组参数
如果将数组变量作为函数参数,函数只会取数组变量的第一个值。
test1() {
echo "接收到的参数列表:s@"
newarrary=($1)
echo "新数组的值为: ${newarrary[*]}”
}
array=(10 20 30 40 50)
echo "原始数组的值为: ${array[*]}"
test1 $array
解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。
test2() {
newarrary=($(echo $@))
echo "新数组的值为: ${newarrary[*]}"
}
array=(10 20 30 40 50)
echo "原始数组的值为: ${array[*]}"
test2 ${array[*]}
8.从函数返回数组
#!bin/bash
test2() {
newarrary=(`echo $@`)
sum=0
for value in ${newarrary[*]}
do
sum=$[$sum + $value]
done
echo $sum
}
test3() {
newarrary=(`echo $@`)
for ((i=0; i<=$[$# - 1]; i++))
{
newarrary[$i]=$[${newarrary[$i]} * 2]
}
echo ${newarrary[*]}
}
array=(10 20 30 40 50)
echo "原始数组的值为: ${array[*]}"
result1=`test2 ${array[*]}`
echo "新数组的和为: $result1"