《Linux命令行与shell脚本编程大全》第十三章 更多的结构化命令

本章讨论bash shell的循环命令for、while和until

13.1 for命令

重复执行一系列命令在编程中很常见。

bash shell提供了for命令,允许你创建一个遍历一系列值的循环。每次迭代都使用其中一个值来执行已定义好的一组命令。下面是基本格式

for var in list

do

command

done

在list参数中需要提供迭代中要用到的一系列值。会依次迭代下去。每次迭代中,var会包含列表中要用到的一系列值。

do 和 done直接输入的命令可以是一条或多条标准的bash shell命令。

 

13.1.1 读取列表中的值

每次for命令遍历值列表,它都会将列表中的下一个值赋给$var变量。最后一次迭代后,$var变量的值会在shell脚本中剩余部分一直保持有效。(除非你修改了它)

 

13.1.2 读取列表中的复杂值

列表值的单引号是个大麻烦。

有两个方法可以解决

1)使用转义字符\。将单引号转义

2)使用双引号来定义用到单引号的值

在某个值两边使用双引号时,shell并不会将双引号当成值的一部分

 

13.1.3 从变量读取列表

将一系列的值都集中存储在了一个变量中,然后需要遍历变量中的整个列表。 

#!/bin/bash

# for test

name1="xcx1 xcx2 xcx3"

name2=$name1" xcx4"

#for name in xc\'y "xcy'1 haha" xcy2 xcy3 xcy4 xcy5

for name in $name2

do

        echo "Hi, My name is $name"

done

echo "The last people is $name"

 

name2包含了用于迭代的标准文本值列表。注意。name2用了另一个复制语句向name2变量包含的以有列表中添(或者说拼接)加了一个值。

 

13.1.4 从命令读取值

生成列表中所需值的另外一个途径就是使用命令的输出。

可以用命令替换来执行任何能产生输出的命令,然后在for命令中使用该命令的输出。

例子:

新建一个文件states,内容如下:

 

《Linux命令行与shell脚本编程大全》第十三章 更多的结构化命令

再建一个test2

#!/bin/bash

file="states"

for state in $(cat $file)

do

        echo "Visit beautiful $state"

done

运行就好了。

for仍然以每次一行的方式遍历的cat命令输出的结果。

 

13.1.5 更改字段分隔符

1.特殊环境变量IFS:内部字段分割符。定义了bash shell用作字段分隔符的一系列字符。

2.默认情况下会将下列字符当做字段分隔符。1)空格 2)制表符 3)换行符

3. 如果bash shell 在数据中看到了这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。

在处理包含空格的数据时会比较麻烦。所以需要修改IFS的值。

只识别换行符,就需要这么做:IFS=$’\n’。将这个语句假如脚本中,告诉bash shell在数据值中忽略空格和制表符。

#!/bin/bash

file="states"

IFS=$’\n’

for state in $(cat $file)

do

        echo "Visit beautiful $state"

done

还有一些绝妙用法:假如需要遍历一个文件中用冒号分割的值。就可以IFS=:

如果需要指定多个字符,只需要将它们在赋值行中串起来就行。IFS=$’\n’:;”  将换行符、冒号、分号、双引号作为字段分隔符

 

13.1.6 用通配符读取目录

可以用for命令来自动遍历目录中的文件。进行此操作时,必须在文件名或路径名中使用通配符。

它会强制使用文件扩展匹配(生成匹配指定通配符的文件名或路径名的过程)。

比如下面的例子:

  1 #!/bin/bash

  2 for file in /home/xcy/shell/*

  3 do

  4         if [ -d "$file" ]  # 加双引号为了解决文件名含有空格的问题

  5         then

  6                 echo "$file is directory"

  7         elif [ -f "$file" ] # 如果文件名有空格,没有双引号就会出错

  8         then

  9                 echo "$file is file"

 10         fi

 11 done

for语句首先使用了文件扩展匹配来遍历通配符生成的文件列表,然后会遍历列表中的下一个文件。可以将任意多的通配符放进列表中。

 

13.2 C语言风格的for命令 13.2.1 C语言的for命令

以下是bash中C语言风格的for循环的基本格式:

for (( variable assignment ; condition ; interation process ))

例子:

for (( a = 1; a < 10; a++ ))

(1)变量赋值可以有空格

(2)条件中的变量不以美元符开头

(3)迭代过程的算式没有用expr命令格式。

 

例子:

  1 #!/bin/bash

  2 # C for test

  3 for (( i = 10; i > 0; i-- ))

  4 do

  5         echo "For Test: i = $i"

  6 done

 

13.2.2 使用多个变量

C语言风格的for命令允许为迭代使用多个变量。循环会单独处理每个变量,可以为每个变量定义不同的迭代过程。

尽管可以使用多个变量,但你只能在for循环中定义一种条件。

例子:

  1 #!/bin/bash

  2 # C for multiple variables test

  3 for (( i=10, b = 0; i > 0; i--, b++ ))

  4 do

  5         echo "For Test: i = $i, b = $b"

  6 done

 

13.3 while命令

某种意义是if-then和for循环的混杂体。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxxjj.html