Shell脚本的基本知识点整理-3

创建函数
函数格式
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
上一篇:GO编程模式学习笔记:MAP-REDUCE


下一篇:利用Java反射动态创建数组