shell 循环语句和字段分隔符

在弄清楚循环语句前,先看看字段分隔符的作用。字段分隔符Internal Field Separator, IFS是shell脚本中的一个重要概念,处理文本数据的时候非常的有用,是把单个数据流划分成不同数据元素的定界符。系统环境默认的IFS是空白字符(换行符、制表符或者空格)。
先验证一下默认的分隔符是空白字符,变量data是一个由空白字符分隔的字符串,用for语句遍历并打印data的每个元素。

1
2
3
4
5
6
#!/bin/bash 
data="hello world !"
for item in $data;
do
echo $item
done

执行脚本,其执行结果验证了确实分隔符默认就是空白字符

1
2
3
4
$ sh test.sh 
hello
world
!

分隔符是可以自定义的,不过使用完成后记得恢复为默认的分隔符。
重新自定义界定符为逗号,分割操作后恢复默认界定符。

1
2
3
4
5
6
7
8
9
10
#!/bin/bash 
data="hello,world,!"
oldIFS=$IFS
#自定义分隔符
IFS=,
for item in $data;
do
echo $item
done
IFS=$oldIFS

执行结果和之前的一样

1
2
3
4
$ sh test.sh 
hello
world
!

再扯扯循环语句,参考了《Linux shell 脚本攻略》这本书,有兴趣可以买来看看,挺不错的。
1、for循环(list可以是字符串和序列)

1
2
3
4
5
6
7
for var in list 
do
commands; #使用变量$var
done

#同时写在一行中就要用分号分割语句块了
$ for i in {a..z}; do action; done;

关于序列怎样生成,可以这样

1
2
3
4
5
$ echo {a..z} 
a b c d e f g h i j k l m n o p q r s t u v w x y z

$ echo {0..25}
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

for循环也可以采用C语言中for循环的格式,是不是开始感觉shell的强大了。

1
2
3
4
5
6
#!/bin/bash 
for((i=0;i<10;i++))
{
#commands; #使用变量$i
echo $i
}

2、while循环 一直执行循环,直到给出的条件为假

1
2
3
4
5
#!/bin/bash 
while condition
do
commands
done

3、until循环 一直执行循环,直到给出的条件为真

1
2
3
4
5
6
#!/bin/bash 
x=0
until [ $x -eq 9 ]
do
let x++; echo $x
done

条件condition的分类
1、算术比较 条件通常放在密闭的中括号内。一定要注意在[] 与操作数之间有个空格,如果没有则会报错

1
2
3
4
5
6
7
8
9
10
11
[ $var -eq 0 ] 
[ $var -ne 0 ]
... ... ...
#重要的一些操作符
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
#可以按照下面的方法结合多个条件进行测试
[ $var1 -ne 0 -a $var2 -gt 2 ] #使用逻辑与
[ $var1 -ne 0 -o $var2 -gt 2 ] #使用逻辑或

2、文件系统相关测试

1
2
3
4
5
6
7
8
9
[ -f $file_var ] #如果给定的变量包含正常的文件路径或文件名,则返回真 
[ -x $var ] #如果给定的变量包含的文件可以执行,则返回真
[ -w $var ] #如果给定的变量包含的文件可以写,则返回真
[ -r $var ] #如果给定的变量包含的文件可以读,则返回真
[ -d $var ] #如果给定的变量包含的是目录,则返回真
[ -e $var ] #如果给定的变量包含的文件存在,则为真
[ -c $var ] #如果给定的变量包含的是一个字符设备文件的路径。则返回真
[ -b $var ] #如果给定的变量包含的是一个块设备文件的路径。则返回真
[ -L $var ] #如果给定的变量包含的是一个符号链接,则返回真

3、字符串比较 当用到>比较运算符时,如果不使用两个嵌套的中括号的话,则脚本在执行时被错误的解析为重定向符,切记!

1
2
3
4
5
6
7
[[ $str1 = $str2 ]] #当str1等于str2时返回真 
[[ $str1 == $str2 ]] #str1等于str2时返回真的另一种写法
[[ $str1 != $str2 ]] #当str1不等于str2时返回真 #比较字符串的字母序情况
[[ $str1 > $str2 ]] #str1字母序列比str2大则返回真
[[ $str1 < $str2 ]] #空字符串判断
[[ -z $str1 ]] #如果str1包含的是空字符串,则为真
[[ -n $str1 ]] #如果str1是非空字符串,则为真
----------------本文结束 感谢阅读----------------