1、选择分支case语句
和其他编程语言不一样的是,shell的选择分支语句为case in
语法:
case $var in
pattern1)
command
;; #;;相当于break
pattern2)
command
;;
pattern3)
command
;;
*) #default,不满足以上分支情况,默认执行*)下的语句
command
;;
esac
案例:
#!/bin/bash
printf "Input integer number: "
read num
case $num in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
3)
echo "Wednesday"
;;
4)
echo "Thursday"
;;
5)
echo "Friday"
;;
6)
echo "Saturday"
;;
7)
echo "Sunday"
;;
*)
echo "error"
esac
2、函数
(1)函数定义
语法:
语法一:
函数名 ()
{
代码块
[return value]
}
语法二:
function 函数名
{
代码块
[return value]
}
(2)函数调用
格式:FunctionName parameter1 parameter2 parameterN
1️⃣脚本中调用
示例:
#! /bin/bash
#----------------------------------------------
# FileName :function.sh
# Author :kerongw
# Date :2021年06月15日
# Description :
#----------------------------------------------
echo "123456789"
#函数定义,$1表示传递第一个参数,$2表示传递的第二个参数
function whobig
{
if(($1>$2||$1==$2))
then
echo "$1 is big"
else
echo "$2 is big"
fi
}
echo "调用函数"
#调用函数并传递参数2 和 5
whobig 2 5
echo "函数调用结束"
2️⃣命令行中调用
脚本中的函数也可以在命令行中调用,不过要先以当前shell进程执行脚本后才可调用
source script.sh
FunctionName parameter1 parameter2 parameterN
示例:
#! /bin/bash
#----------------------------------------------
# FileName :function.sh
# Author :kerongw
# Date :2021年06月15日
# Description :
#----------------------------------------------
echo "函数定义前"
fun_test()
{
echo "传递给函数的第一个参数为:$1"
echo "传递给函数的第二个参数为:$2"
echo "传递给函数的第三个参数为:$3"
}
echo "函数定义结束"
source命令可以在当前bash环境下读取并执行FileName中的命令,我们一般直接执行脚本的话是在后台另起一个shell进程执行我们的脚本。而使用source命令可以使当前的脚本直接在当前的shell中直接运行
(3)函数传参
给函数传参和给shell脚本传递参数相似,在函数内部参数都是用$n
来接受的。除了$n外还有三个比较重要的变量
$#
:可以获取传递参数的个数$@
或$*
:可以一次性获取所有参数。详情参见
function funtest
{
echo "一共给函数传递了$#个参数"
echo "参数是$*"
echo "第一个参数是$1"
echo "第一个参数是$2"
echo "第一个参数是$3"
}
echo "函数调用开始"
funtest aa bb cc
echo "函数调用结束"
(4)函数返回值
shell中的返回值表示函数的退出状态。返回0表示成功,返回非0表示失败出错了
shell函数返回值只能介于0~255之间,0表示成功,非0表示失败,具体可自定义
。若函数没有return 语句,则使用默认退出状态,即最后一条命令的退出状态。因此严禁的写法为return $?
#! /bin/bash
#----------------------------------------------
# FileName :return.sh
# Author :kerongw
# Date :2021年06月15日
# Description :
#----------------------------------------------
function fun_test1
{
return $(($1+$2))
}
function fun_test2
{
echo "command" > /dev/null
return $? #当函数没有返回值时,我们应该返回上一条命令的返回值
}
fun_test1 1 2
echo "fun_test1 return value is $?"
fun_test2
echo "fun_test2 return value is $?"
对于超过255或者其他类型的返回值,可以借助以下方式获取返回值
- 借助全局变量,将返回结果赋值给全局变量
- 在函数内部使用echo 、printf命令将结束输出,在函数外部使用$()或``捕获结果
①借助全局变量获取返回值
#! /bin/bash
#----------------------------------------------
# FileName :global.sh
# Author :kerongw
# Date :2021年06月15日
# Description :
#----------------------------------------------
sum=0
function getsum
{
for ((i=$1;i<$2;i++))
do
((sum=sum+$i))
done
return $? #严谨起见无返回值时应该返回上一条命令的执行结果
}
sum=0 #调用之前对全局变量清零
getsum 1 10
echo "getsum 返回值sum=$sum"
sum=0 #调用函数之前对全局变量清零
getsum 1 100
echo "getsum 返回值sum=$sum"
~
②借助echo输出获取返回值
function getsum
{
sum=0
for ((i=$1;i<$2;i++))
do
((sum=sum+$i))
done
echo $sum
return $? #严谨起见无返回值时应该返回上一条命令的执行结果
}
value1=`getsum 1 10`
value2=$(getsum 1 100)
echo "getsum 返回值value1=$value1"
echo "getsum 返回值value2=$value2"