一、条件测试
程序运行中经常需要根据实际情况来运行特定的命令或代码段,比如判断两个变量值大小关系,判断是否为目录/文件。我们需要自己实现一个判断的过程。可以使用test或 [测试一个条件是否成立,如果测试结果为真,返回0,如果测试结果为假,返回1,如果使用[开头需要使用]结尾。
- test -d x 如果x是一个目录则条件为真返回0
- test -f x 如果x是一个普通文件则条件为真返回0
- test -z x 如果x的长度为零则条件为真返回0
- test s1 = s2 如果两个字符串相同则为真返回0
- test num1 OP num2 num1和num2应该是整数或者取值为整数的变量,OP可以是以下判断中的任意一个: -eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)
- 同样还支持逻辑判断exp1 -a exp2表示逻辑与;exp1 -o exp2表示逻辑或;!exp表示逻辑非。
**注意:**使用[]时[ 后面有个空格,]前面也有一个空格,不添加会报错。
如何查看返回值呢?
可以通过echo $?获取返回值,例如:
二、判断
if判断
格式:
if 条件测试; then
命令
fi
以if开始,fi结尾
if/else判断格式:
if 条件测试;then
命令
else
命令
fi
if/elif/else判断格式:
if 条件测试1;then
命令1
elif 条件测试2;then
命令2
elif 条件测试3;then
命令3
...
fi
我们简单运用一下if:
在helloworld.sh同一目录下创建新文件test.sh
#!/bin/bash
if [ -f ./helloworld.sh ];then
echo "helloworld.sh is a file"
else
echo "helloworld.sh is not a file"
fi
如下图:
创建出来的文件默认不带有可执行权限,可以通过上一篇的方法给文件+权限,也可以使用. 文件
的方法执行此文件:
case判断
case作用就和C语言中的switch case一样,只不过没有switch,以case开头esac结尾,格式如下:
case 变量 in
常量或者表达式1) 命令1 ;;
常量或者表达式2) 命令2 ;;
常量或者表达式3) 命令3 ;;
常量或者表达式4) 命令4 ;;
esac
末尾的;;
相当于C语言中的break
示例:
#!/bin/bash
printf "please input your choice : [y/n/h/q]\n"
read VAR #从键盘中读取 可以理解为cin
case $VAR in
y|Y) echo "your choice is Yes!" ;;
n|N) echo "your choice is No!" ;;
h|H) echo "you need help!" ;;
q|Q) echo "your choice is Quit!" ;;
esac
效果如下:
补充: 在case中*)
的作用就类似于default。
三、循环
for循环
以下示例需要自己添加可执行权限,不在重复提示
1.类C for循环:
所谓类C就是和C语言的for循环结构相同,如下:
#!/bin/bash
for((i = 0; i < 10; i++))
do
echo "the time is $i"
done
其中,do
的位置和之前的then
位置相同,可以和for同一行,但需要;隔开,也可以换行写,示例如下:
#!/bin/bash
for((i = 0; i < 10; i++));do
echo "the time is $i" #$i取值
done
执行结果:
2.带列表的for循环
设置一个变量 在一个列表中自动循环,类似C++中for(auto fruit:fruits);
代码:
#!/bin/bash
for FRUIT in apple orange strawberry banana pear
do
echo "I like $FRUIT"
done
效果:
3.不带列表的for循环
上个例子,列表是for循环的范围,那不给列表怎么循环呢?所以在运行脚本时,我们必须通过参数传递一个“范围”,传递一个列表。
代码:
#!/bin/bash
for FRUIT
do
echo "I like $FRUIT"
done
运行结果:
while循环
格式:
while 条件
do
命令
done
代码示例(输入一个数字,递减到1):
#!/bin/bash
printf "设置倒计时:"
read time
while [ $time -gt 0 ]
do
echo "$time"
let "time-=1" #let 执行算数操作
done
运行效果: