目录
一、循环语句
1、for循环语句
for循环语句,是根据次数来控制循环,对每一个元素进行操作,一直到使用玩元素退出循环。
- for循环语句的结构
1.1、for—列表循环
- 使用格式:
for 变量名 in {list}
do
command
done
案例一:输出一到五序列
[root@localhost ceshi]# vim ceshi1.sh
#!/bin/bash
#需求:输出1-5
for i in {1..5}
do
echo $i
done
- 结果
案例二:打印6次“Goodbye”
[root@localhost ceshi]# vim ceshi2.sh
#!/bin/bash
#需求:打印6次Goodbye
for i in {1..6}
do
echo "Goodbye"
done
案例三:打印abcde
[root@localhost ceshi]# vim ceshi3.sh
#!/bin/bash
#需求:打印abcde
for i in a b c d e
do
echo $i
done
案例四:输入0-50之间的偶数
[root@localhost ceshi]# vim ceshi4.sh
#!/bin/bash
#需求:输出0-50之间的偶数
for i in {0..50..2}
do
echo $i
done
1.2、for—不带列表循环
- 使用格式
for 变量名
do
command
done
- 注意:需要在运行脚本时添加列表参数
案例一:打印“Goodnight”
- 第一种
[root@localhost ceshi]# vim ceshi5.sh
#!/bin/bash
#需求:打印Goodnight
for i
do
echo "Goodnigth"
done
- 第二种
[root@localhost ceshi]# vim ceshi6.sh
#!/bin/bash
for i
do
echo $i
done
1.3、类C风格的for循环
- 语法格式
for ((expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
注:
- i++ : i=1+1 先赋值再运算 i=1 之后 再 +1
- ++i : 1+1=i 先运算再赋值 1+1 之后 再=i
运算符用法:
操作符 | 说明 | 示例 | 结果(假设变量 x 初始值为 10) |
---|---|---|---|
++ | 自身变量 + 1 | x++ | x 变为 11 |
-- | 自身变量 - 1 | x-- | x 变为 9 |
+=5 | 自身变量 + 5 | x += 5 | x 变为 15 |
-=5 | 自身变量 - 5 | x -= 5 | x 变为 5 |
*=5 | 自身变量 * 5 | x *= 5 | x 变为 50 |
/=5 | 自身变量 / 5 | x /= 5 | x 变为 2 |
%=5 | 自身变量 % 5 | x %= 5 | x 变为 0 |
案例一:打印1-6
[root@localhost ceshi]# vim ceshi7.sh
#!/bin/bash
for (( i=1; i<=6; i++))
do
echo $i
done
案例二:打印1-20的奇数
[root@localhost ceshi]# vim ceshi8.sh
#!/bin/bash
for (( i=1; i<=20; i+=2))
do
echo $i
done
案例三:计算1-100的奇数和
[root@localhost ceshi]# vim ceshi9.sh
#!/bin/bash
sum=0
for (( i=1; i<=100; i++))
do
let sum=$i+$sum
done
echo "1-100的奇数和为:$sum"
2、while循环语句
while循环语句根据判断条件(表达式)来是否执行下一条的指令,如果为真,则执行,如果为假,则跳出循环。
- 语法格式
while 表达式
do
command
done
- while循环语句的结构
2.1、while死循环
死循环一:
//写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
while [ 1 -eq 1 ]
command
done
死循环二:
while true
do
command
done
死循环三:
while :
do
command
done
2.2、循环控制语句
①、exit语句:
exit
命令用于终止整个脚本的执行。可选的参数n是一个整数值,表示脚本的退出状态。通常,0表示成功,非零值表示出现了错误
②、break:
break
命令用于跳出循环。当遇到break
时,程序会立即跳出当前的循环结构,并执行循环后面的语句
③、continue:
continue
命令用于结束当前循环的迭代,然后继续下一次迭代。当程序执行到continue
时,会立即停止当前迭代并进入下一次循环迭代
总结
命令 | 功能描述 | 使用示例 |
---|---|---|
exit | 直接跳出程序,后面可跟状态返回码如 exit 1 等等 | exit 0 |
break | 立即终止当前循环,执行循环体外的代码 | break |
continue | 跳过当前循环的剩余部分,开始下一次循环 | continue |
案例一:输出1-10
[root@localhost ceshi]# vim ceshi10.sh
#!/bin/bash
i=1
while [ $i -le 10 ]
do
echo $i
let i++
done
echo "i最终值为:$i"
案例二:输出1-20之间不能被4整除的数字
[root@localhost ceshi]#
#!/bin/bash
i=1
while [ $i -le 20 ]
do
if [[ $i%4 -ne 0 ]];then
echo "$i"
fi
let i++
done
案例三:输出1-100的和
[root@localhost ceshi]# vim ceshi12.sh
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
let sum=$i+$sum
let i++
done
echo "1-100的和为:$sum"
二、Shell函数
1、Shell函数的语法格式(两种)
function 函数名 {
command
} //这是一种规范写法
或者
函数名(){ //最常用因为最简洁
command
}
- 函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用
- 定义的时候哪怕出现语法错误也没关系,不调用就不会报错
- 当然我们写函数最终目的还是为了调用,为了实现某个功能块
2、函数返回值
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
函数使用原则:
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
- 退出状态码必须是0~255,超出时值将为取余256
3、函数的调用
直接在脚本里定义函数的代码块后写函数名即可完成调用
[root@localhost ceshi]# vim ceshi1.sh
#!/bin/bash
function zmx {
echo "this is cxc"
}
zmx
[root@localhost ceshi]# sh ceshi1.sh
this is cxc
①、注意:函数名必须是唯一,如果先定义了一个,再用同样的名称定义,第二个会覆盖第一个的功能,出现了你不想要的结果,所以这里一定要注意不要重名!
例如:
[root@localhost ceshi]# vim ceshi2.sh
#!/bin/bash
f6 (){
echo oppo
}
f6 (){
echo Good
}
f6
[root@localhost ceshi]# sh ceshi2.sh
Good
②、注意:注意②:调用函数之前必须先进行定义!
[root@localhost ceshi]# vim ceshi3.sh
#!/bin/bash
f1 (){
echo hello
}
f3 (){
echo "$(f1) $(f2)"
}
f2 (){
echo world
}
f3
[root@localhost ceshi]# sh ceshi3.sh
hello world
③、注意:注意③:不一定要在脚本开头就定义函数,只要调用之前定义就可以
如果是在其他地方嵌套调用等情况,不可以直接写函数的值,避免无法识别,可以用反撇号引起来,相当于是调用函数的结果
[root@localhost ceshi]# vim ceshi4.sh
#!/bin/bash
f1 (){
echo hello
}
f2 (){
echo world
}
f3 (){
echo "`f1` `f2`"
}
f3
[root@localhost ceshi]# sh ceshi4.sh
hello world
4、函数的作用范围
- 在 Shell 脚本中函数的执行并不会开启一个新的子 Shell,而是仅在当前定义的 Shell 环境中有效。
- 如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。
- 在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。
- 函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。
local命令:将变量限定在函数内部使用
[root@localhost ceshi]# vim ceshi5.sh
fun (){
local i
i=66
echo $i
}
i=99
fun
echo $i
[root@localhost ceshi]# sh ceshi5.sh
66
99
- fun 函数外部同样定义了变量i,内部变量i和全局变量i互不影响。脚本执行时先调用了函数fun,函数内部变量i为66,所以输出结果是66。调用完函数之后,给变量i赋值为99,再打印外部变量i,所以又输出 99。
5、函数的参数
语法格式
函数名称 参数1 参数2 参数3..........
5.1、计算位置变量$1和$2的和
[root@localhost ceshi]# vim ceshi6.sh
#!/bin/bash
add (){
let sum=$1+$2
echo $sum
}
add 4 5
[root@localhost ceshi]# sh ceshi6.sh
9
5.2、调用函数删除文件
[root@localhost home]# vim ceshi1.sh
#!/bin/bash
fun (){
rm -rf $1
}
fun /home/ceshi.txt
6、 return返回值
函数的返回值就是函数当中运行最后一条命令的状态码,默认成功为0,失败为非0值,可以通过$?查看
- return的值范围是0-255
- 遇到return即结束函数不会再往下执行
[root@localhost home]# vim ceshi2.sh
#!/bin/bash
FILE=/home/kfc
test (){
if [ -f $FILE ];then
return 100
else
return 200
fi
}
test
7、函数的递归
函数自己调用自己的本身
案例:筛选目录
[root@localhost home]# vim ceshi3.sh
#!/bin/bash
list(){
for i in $1/*
do
if [ -d $i ];then
echo -e "\e[34m$i\e[0m"
list $i " $2"
else
echo "$2$i"
fi
done
}
list $1 $2