一、分支语句
case ...in语句
shell中的switch语句
case $变量名 in
常量1)
语句
;; ------->类似于C中break的作用,;;除了最后一条分之外,都不能省略
常量2)
语句
;;
····
常量n)
语句
;;
*) ------->类似于C中default,但是*表示通配所有情况,只能放在最后
语句
esac
其中常用到的条件有
1|2|3|4):满足1,2,3,4中任一个即可
[0-9]):满足0-9中任一个
[0-3]|4):满足0-3和4中的任一个
注意:*通配所有情况,如果想使用*表示其他分支的情况,不能把*放在上面,与default不一样!
二、循环语句
在shell中,循环语句不使用{}作为作用域,使用do..done
1、while
while [ test语句 ] ------>while test 表达式
do
循环体
done
2、for
for也可以使用c语言风格的格式,或者shell风格的格式,让变量遍历字符串列表
第一种:类似于C的格式
for ((表达式1;表达式2;表达式3))
do
循环体
done
第二种:shell中的格式
for 变量名 in 字符串列表
do
循环体
done
连续使用列表
1、seq 起始值 间隔值 终止值 ---->在终端回显,起始到终止值间的连续序列
seq 1 1 100 --->输出1-100
seq 如果后面只有一个数,默认是终止值,起始值和间隔值默认为1
拿到seq的结果需要使用命令置换符
`seq 1 1 100`
2、{1..3} ---->展开1-3内的每一个数,中间是两个.不能多写
3、select...in
select 变量名 in 选项列表
do
语句块
done
变量名会一一遍历选项列表,遍历次数个选项个数一致
执行逻辑:
会在终端打印选项列表,让用户选择,用户选择是需要选择对应的序号,
如果用户不输入直接回车,会再打印一次选项列表,
如果选择错误,变量就获取到空值
一般select与case...in结合使用
如
select i in linux wins macos q Q
do
case $i in
linux)
echo "打开的是Linux系统"
;;
wins)
echo "打开的是wins系统"
;;
macos)
echo "打开的是macos系统"
;;
q)
break
;;
Q)
exit
;;
*)
echo "选择错误"
esac
done
echo hello world
三、辅助控制关键字
与c中跳出循环关键字相似
1、break
退出循环
break n ------->退出n层循环
break 1 ------->1可以不写
2、continue
跳出循环
continue n ------->退出n层本次循环
continue 1 ------->1可以不写
四、函数
由于脚本中是不存在返回值类型,所以在函数名前是function开头(可加可不加)之后形参列表没有参数
bash
function 函数名()
{
函数体
return 返回值(如果实现函数时有返回值就写return)
}
bash
shell中函数的注意事项:
1、function在定义函数时,可以加也可以不加(建议加)
2、()内不能添加任何内容,函数是否有参数根据调用来决定
3、如果函数有返回值,直接在函数的定义中写出return
4、shell中的函数仍然满足先定义后调用的原则,shell中函数的定义和声明不能分开
外部传参不能传到函数内,只能给全局,函数传参需要的方式是
bash
函数名 实参1 实参2 实参3 ···· (函数有参数的情况)
函数名 (没有参数)
而函数内部同样可以通过位置变量获取${n}
bash
脚本的外部传参和函数的外部传参互不干扰:
如果在函数中使用位置变量获取到的就是函数的外部参数,
如果在脚本中使用位置变量获取到的就是脚本的外部参数,$0只能获取脚本名
当想获取函数中的返回值时,由于不像c中有类型,所以获取的方式也不一样,使用
bash
$? 获取函数的返回值 ----->使用$?的上一条指令一定是函数的调用
$?的本质是获取到上一条指令的执行结果,
例如
bash
#!/bin/bash
function fun()
{
echo hello world
}
function add()
{
echo $(($1+$2))
echo $0
a=258
return $a #返回值只能返回0-255之中的数
}
add 12 34
var=$? #使用$?接收函数的返回值
echo $var
echo $a
在调用传参之后,使用var接受上一条结束的返回值
而在返回值超过258时,使用全局也能进行传递(Bash 中的退出状态码(包括 return
语句的值)是 8 位无符号整数,所以它们会自动进行模 256 运算)
或者使用命令置换的方法
bash
function add() {
echo 258
}
result=$(add)
echo $result # 这将输出 258
local声明局部变量
在局部使用将变量定义成局部变量
bash
function add()
{
#echo $(($1+$2))
#echo $0
a=258
local b=80 #被定义成了一个局部变量
echo $b
unset b #unset是可以清空局部变量
echo $b
return $a #返回值只能返回0-255之中的数
}
- 实现一个对数组求和的函数,数组通过实参传递给函数
bash
#!/bin/bash
function array_sum() {
local sum=0
for num in "$@"; do
sum=$((sum + num))
done
echo $sum
}
result=$(array_sum "$@")
echo "The sum of the array is: $result"
2.写一个函数,输出当前用户的uid和gid,并使用变量接收结果
bash
#!/bin/bash
uid=0
gid=0
function id_func(){
uid=$(id | cut -d' ' -f1 | cut -d'=' -f2 | cut -d'(' -f1)
gid=$(id | cut -d' ' -f2 | cut -d'=' -f2 | cut -d'(' -f1)
}
id_func
echo "UID: $uid"
echo "GID: $gid"