shell 循环语句和字段分隔符

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

先验证一下默认的分隔符是空白字符,变量data是一个由空白字符分隔的字符串,用for语句遍历并打印data的每个元素。

#!/bin/bash
data="hello world !"
for item in $data;
do
    echo $item
done

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

[user01@minion02 ~]$ sh test.sh 
hello
world
!

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

#!/bin/bash
data="hello,world,!"
oldIFS=$IFS
#自定义分隔符
IFS=,
for item in $data;
do
    echo $item
done
IFS=$oldIFS

执行结果和之前的一样

[user01@minion02 ~]$ sh test.sh 
hello
world
!

再扯扯循环语句,参考了《Linux shell 脚本攻略》这本书,有兴趣可以买来看看,挺不错的。

1、for循环(list可以是字符串和序列)

for var in list
do
commands; #使用变量$var
done

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

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

[user01@minion02 ~]$ 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
[user01@minion02 ~]$ 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
[user01@minion02 ~]$ 

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

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

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

#!/bin/bash
while condition
do
commands
done

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

#!/bin/bash
x=0
until [ $x -eq 9 ]
do
let x++; echo $x
done

条件condition的分类

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

[ $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、文件系统相关测试

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

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

[[ $str1 = $str2 ]]    #当str1等于str2时返回真
[[ $str1 == $str2 ]]    #str1等于str2时返回真的另一种写法
[[ $str1 != $str2 ]]    #当str1不等于str2时返回真
#比较字符串的字母序情况
[[ $str1 > $str2 ]] #str1字母序列比str2大则返回真
[[ $str1 < $str2 ]]
#空字符串判断
[[ -z $str1 ]]    #如果str1包含的是空字符串,则为真
[[ -n $str1 ]]    #如果str1是非空字符串,则为真

转载请注明出处:http://www.xiaomastack.com/2014/10/31/shell-iterator/ 谢谢!

发表评论:

你的电子邮件地址将不会被公开.

56 − = 50

3 Trackbacks

  1. shell脚本中诡异的if语句 | 小马 (Pingback)
  2. clash of clan hack (Trackback)
  3. fifa 15 (Trackback)