创建函数
函数格式
function name {
commands
}
示例:
#!/bin/bash
function func1 {
echo "This is an example of a function!"
}
count=1
while [ $count -le 5 ]
do
func1
count=$[ $count + 1 ]
done
echo "Now this is the end of the script"
函数返回值
#!/bin/bash
function func1 {
echo "trying to display a non-exitent file"
ls -l badfile
return ret
}
echo "test the function:"
func1
echo "The exit status is:$?"
输出:
test the function:
trying to display a non-exitent file
ls: 无法访问'badfile': 没有那个文件或目录
The exit status is:2
函数退出的状态码是2
内部返回使用 return 返回返回值。
Shell 函数的返回值只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。
外部调用使用 $? 获取返回值。
注意事项:
1) 函数一结束就取返回值。
2) 退出的状态码必须是0~255。
函数输出和函数中使用变量
#!/bin/bash
function db1 {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=$(db1)
echo "The new value is ${result}"
向函数传递参数
使用 $# 判断函数参数的个数,使用 $n ($1、$2、$3…)使用函数的各个参数。
#!/bin/bash
function addem {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
value=$(addem 10 15)
echo $value
value=$(addem 10)
echo $value
value=$(addem 10 15 20)
echo $value
函数中处理全局变量
#!/bin/bash
function addem {
value=$[ $value * 2 ]
}
read -p "Enter a value :" value
addem
echo "New Value: ${value}"
输出:
Enter a value :45
New Value: 90
函数中处理局部变量
无需再函数中使用全局变量,函数内部任何变量都可以被声明成局部变量。加上 local 的关键字就可以了。local关键字保证了变量只局限在这函数中,如果函数外有同样名字的变量,shell会保持这两个变量的值是分离的。
local temp
local temp=$[ $value + 5 ]
示例:
#!/bin/bash
function addem {
temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
addem
echo "The reult is ${result}"
输出:
The reult is 22
数组变量和函数
数组操作
1.直接定义
数组名=(value1 value2 value3 …)
value可以是数值、字符串、单个字符,以空格分隔
若value中有空格键或者tab键则必须使用双引号或者单引号
2.declare定义
declare -a 数组名=(value1 value2 value3 …)
declare选项
-a:声明数组
-i:声明整型变量
-r:声明一个只读变量
-f:打印脚本中的所有定义的函数的全部内容
-F:仅打印脚本中所有定义的函数的名字
3.数组相关操作
A
r
r
a
y
[
∗
]
=
{Array[*]}=
Array[∗]={Array[@]}
获取数组所有元素
KaTeX parse error: Expected '}', got '#' at position 2: {#̲Array[*]}={#Array[@]}
获取数组的元素个数即数组长度
!
A
r
r
a
y
[
∗
]
=
{!Array[*]}=
!Array[∗]={!Array[@]}
获取数组的所有索引
${Array[*]:idnex:n}
从数组索引index处开始取n个元素
#!/bin/bash
function testit {
local newarray
newarray=($(echo "$@"))
echo "The new array value is :${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "Ths original array is ${myarray[*]}"
testit ${myarray[*]}
输出:
Ths original array is 1 2 3 4 5
The new array value is :1 2 3 4 5
使用数组里面值
#!/bin/bash
function testit {
local newarray
newarray=($(echo "$@"))
echo "The new array value is :${newarray[*]}"
for value in ${newarray[*]}
do
sum=$[ $sum + $value]
done
echo "sum:${sum}"
}
myarray=(1 2 3 4 5 10 20 30 40 50)
echo "Ths original array is ${myarray[*]}"
testit ${myarray[*]}
输出:
Ths original array is 1 2 3 4 5 10 20 30 40 50
The new array value is :1 2 3 4 5 10 20 30 40 50
sum:165
从函数中返回数组
#!/bin/bash
function testit {
local origarray
local newarray
local elements
local i
origarray=($(echo "$@"))
newarray=($(echo "$@"))
elements=$[ $# - 1 ]
echo "origarray:${origarray[*]}"
echo "newarray:${newarray[*]}"
echo "elements:${elements}"
for i in $(seq 0 $elements)
do
newarray[i]=$[ origarray[i] * 2 ];
done
echo ${newarray[*]}
}
myarray=(1 2 3 4 5 )
echo "The original array is : ${myarray[*]}"
arg1=$(echo ${myarray[*]})
echo "arg1:${arg1}"
result=($(testit $arg1))
echo "The new array is : ${result[*]}"
输出:
The original array is : 1 2 3 4 5
arg1:1 2 3 4 5
The new array is : origarray:1 2 3 4 5 newarray:1 2 3 4 5 elements:4 2 4 6 8 10
函数的递归
#!/bin/bash
function factorial {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 -1 ]
local result=$(factorial $temp)
echo $[ $result * $1 ]
fi
}
read -p "Enter value:" value
result=$(factorial $value)
echo "The factorial of $value is: $result"
输出:
Enter value:5
The factorial of 5 is: 120