文件测试和判断语句
文件测试
- [root@localhost ~]# ls 文件名
- echo $? :输出0时,为文件存在。输出非0时则表示文件不存在。
测试结构:
第一种使用方式是直接使用test命令,格式:
test expression
第二种:[ expression ]
需要注意的是括号和表达式expression之间都有空格。推荐使用第二种方式。
文件测试符
字符串测试
- shell中的字符串比较主要有等于、不等于、大于、小于、是否为空等测试。
字符串测试 | 说明 |
-n string | 若string的长度不为0,则为真,否则为假 |
-z string | 若string的长度为0,则为真,否则为假 |
string1 = string2 | 若string1等于string2,则为真,否则为假 |
string1 != string2 | 若string1不等于string2,则为真,否则为假 |
string1 > string2 | 若string1排在string2之前则为真,否则为假 |
string1 < strint2 | 若string1排在string2之后则为真,否则为假 |
整数比较
整数比较 | 比较符 | 说明 |
-gt | > | 大于 |
-eq | ==或= | 等于 |
-ne | != | 不等于 |
-ge | >= | 大于等于 |
-lt | < | 小于 |
-le | <= | 小于等于 |
逻辑测试符
- 逻辑测试用于连接多个测试条件,并返回整个表达式的值。
- 逻辑测试主要有逻辑非、逻辑与、逻辑或3种
# 非(!)、与(-a)、或(-o)
! expression 如果expression为真,则测试结果为假
expressionl -a expression2 expressionl和expression2同时为真,则测试结果为真
expression1 -O expression2 expressionl和expression2只要有一-个为真,则测试结果为真
- 实例
# 逻辑非
[root@bzx ~]# [ ! -e /var/log/messages ]
[root@bzx ~]# echo $?
1
# 逻辑与
[root@sunday-test ~]# [ -e /var/log/messages -a -e /var/log/messages01 ]
[root@sunday-test ~]# echo $?
1
# 逻辑或
[root@sunday-test ~]# [ -e /var/log/messages -o -e /var/log/messages01 ]
[root@sunday-test ~]# echo $?
0
- shell中的逻辑运算符,也有逻辑非、逻辑与、逻辑或 3种
! 逻辑非,对真假取反.
&& 逻辑与,连接两个表达式,只有两个表达式为真结果才为真
|| 逻辑或,连接两个表达式,只要有一个表达式为真结果就为真
判断结构
if语句
- if判断结构
if expression1;then
command1
command2
fi
- if/else判断结构
if expression1;then
command1
else
command2
fi
- if/elif/else判断结构
if expression1;then
command1
elif expression2;then
command2
elif expression3;then
command3
fi
case语句
- case判断结构
case VAR in
var1) command1 ;;
var2) command2 ;;
var3) command3 ;;
…
*) command4 ;;
esac
从上到下依次比较VAR和var1,var2,var3的值是否相等,如果匹配则执行后面的命令语句,都不匹配则匹配最后的默认*,执行后面的默认命令。
case判断结构中的 var1,var2,var3等值只能是常量或正则表达式。
for循环
for循环:是最常见的循环结构
- for循环是一种运行前测试语句,也就是在运行任何循环体之前先要判断循环条件是否成立,只有在条件成立的情况下才会运行循环体,否则将退出循环。每完成一次循环后,在进行下一次循环之前都会再次进行测试。
1、带列表的for循环
用于执行一定次数的循环(循环次数等于列表元素个数),其语法结构如下:
for VARIABLE in (list)
do
command
done
- 可以先定义变量,然后用变量替代列表
- 列表也可以是数字:
- 可以使用seq命令结合命令替换的方式生成列表。
- 可以使用“步长”计算1到100的奇数和
- 列表也可以是命令的输出
2、类C的for循环
格式如下:
for ((expression1; expression2; expression3))
do
command
done
其中,expression1为初始化语句,一般用作变量定义和初始化;expression2为判断表达式,用于测试表达式返回值并以此控制循环,返回值为真则循环继续,返回值为假则退出循环;expression3用于变量值修改,从而影响expression2的返回值,并以此影响循环行为。
- 还可以初始化多个值,例如:
[root@www shell-script]# cat c_for02.sh
#!/bin/bash
for ((i=1,j=100;i<=10;i++,j--))
do
echo "i=$i j=$j"
done
for的无限循环
#!/bin/bash
for ((i=0;i<1;i+=0))
do
echo "infinite loop"
done
while循环
和for循环一样,while循环也是一种运行前测试语句,语法更简单:
while expression
do
command
done
首先while将测试expression的返回值,如果返回值为真则执行循环体,返回值为假则不执行循环。循环完成后进入下一次循环之前将再次测试。如果已知循环次数,可以用计数的方式控制循环,即设定一个计数器,在达到规定的循环次数后退出循环。例如:
- 使用while按行读取文件按行读取文件是while的一个非常经典的用法,常用于处理格式化数据。例如有个文件如下:
[root@sunday-test shell-script]# cat student_info.txt
John 30 Boy
Sue 28 Girl
Wang 25 Boy
Xu 23 Girl
[root@sunday-test shell-script]# cat while03.sh
#!/bin/bash
cat student_info.txt | while read LINE
do
NAME=`echo $LINE | awk '{print $1}'`
AGE=`echo $LINE | awk '{print $2}'`
Sex=`echo $LINE | awk '{print $3}'`
echo "my name is $NAME,I'm $AGE years old, I'm a $Sex"
done
运行结果:
- while死循环:
- 方法1:
while ((1))
do
command
done
- 方法2:
while true
do
command
done
- 方法3:
while :
do
command
done
- 可以利用while的无限循环实时的监控系统进程,以保证系统中的关键应用一直处于运行状态
循环控制
1、break语句
break用于终止当前整个循环体。一般都是和if判断语句一起使用,当if条件满足时使用break终止循环。
使用for的嵌套打印九九乘法表:
[root@sunday-test shell-script]# cat break01.sh
#!/bin/bash
for ((i=1;i<=9;i++))
do
for ((j=1;j<=9;j++))
do
if [ $j -le $i ]; then
let "multi=$i * $j"
echo -n "$i*$j=$multi "
else
break
fi
done
echo
done
2、continue语句
continue语句用于结束当前循环转而进入下一次循环,注意:这是和break不同的地方,
continue并不会终止当前的整个循环体,它只是提前结束本次循环,而循环体还将继续执行;
而break则会结束整个循环体。
- 例如:
[root@sunday-test shell-script]# cat continue01.sh
#!/bin/bash
for ((i=1;i<=100;i++))
do
if ! (($i%2));then
continue
fi
echo -n "$i "
done
echo
运行结果:
[root@sunday-test shell-script]# bash continue01.sh
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57
59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
如果将continue换成break
[root@sunday-test shell-script]# cat continue02.sh
#!/bin/bash
for ((i=1;i<=100;i++))
do
if ! (($i%2));then
break
fi
echo -n "$i "
done
echo
运行结果则会为:
[root@sunday-test shell-script]# bash continue02.sh
1