天天看点

shell编程中for/while/until循环命令

一、for命令

    在shell编程中,有时我们需要重复执行一直命令直至达到某个特定的条件,bash shell中,提供了for命令,允许你创建一个遍历一系列值的循环,每次迭代都通过一个该系列中的值执行一组预定义的命令。

for的基本格式:

    for var in list

    do

        commands

    done

    在list中,你提供了迭代中要用的一系列值。在每个迭代中,变量var包含列表中的当前值,第一个迭代会适用列表中的第一个值,第二个迭代使用第二个值,以此类推,直至列表中的所有值都过一遍。

1.1读取列表中的值

<code>[root@sh shell]</code><code># cat for1.sh</code>

<code>#!/bin/bash</code>

<code>for</code> <code>test</code> <code>in</code> <code>aaa bbb ccc ddd</code>

<code>do</code>

<code>        </code><code>echo</code> <code>the next state is $</code><code>test</code>

<code>done</code>

<code>[root@sh shell]</code><code># sh for1.sh </code>

<code>the next state is aaa</code>

<code>the next state is bbb</code>

<code>the next state is ccc</code>

<code>the next state is ddd</code>

$test变量的值会在shell脚本的最后一次迭代中一直保持有效,除非你修改了它

<code>[root@sh shell]</code><code># cat for1.sh </code>

<code>    </code><code>echo</code> <code>the next state is $</code><code>test</code>

<code>echo</code> <code>"the last state we visited was $test"</code>

<code>test</code><code>=fff</code>

<code>echo</code> <code>"wait. now we're visiting $test"</code>

<code>the last state we visited was ddd</code>

<code>wait. now we're visiting fff</code>

1.2读取列表中的复杂值

在shell脚本中,优势你会遇到难处理的数。下面是个给shell脚本程序员带来麻烦的经典例子:

<code>[root@sh shell]</code><code># cat for2.sh </code>

<code>for</code> <code>test</code> <code>in</code> <code>I don</code><code>'t know if this'</code><code>ll work</code>

<code>    </code><code>echo</code> <code>"word:$test"</code>

<code>[root@sh shell]</code><code># sh for2.sh </code>

<code>word:I</code>

<code>word:dont know </code><code>if</code> <code>thisll</code>

<code>word:work</code>

解决办法:使用转义符或者双引号

<code>for</code> <code>test</code> <code>in</code> <code>I don\</code><code>'t know if "this'</code><code>ll" work</code>

<code>word:don't</code>

<code>word:know</code>

<code>word:</code><code>if</code>

<code>word:this'll</code>

记住:for循环假定每一个值都是用空格分割的,如果在单独的数字值中有空格,那么你必须使用双引号来将这些值圈起来。

1.3从变量读取列表

<code>[root@sh shell]</code><code># cat for3.sh </code>

<code>############################</code>

<code>list=</code><code>"aaa bbb ccc ddd eee"</code>

<code>list=$list</code><code>" Connecticut"</code>

<code>for</code> <code>state </code><code>in</code> <code>$list</code>

<code>  </code><code>echo</code> <code>"Have you ever visited $state"</code>

<code>[root@sh shell]</code><code># sh for3.sh </code>

<code>Have you ever visited aaa</code>

<code>Have you ever visited bbb</code>

<code>Have you ever visited ccc</code>

<code>Have you ever visited ddd</code>

<code>Have you ever visited eee</code>

<code>Have you ever visited Connecticut</code>

1.4从命令读取值

<code>[root@sh shell]</code><code># cat for4.sh </code>

<code>file</code><code>=</code><code>"/root/shell/states"</code>  <code>#如果是在当前不用绝对路径,file=“states”即可</code>

<code>for</code> <code>state </code><code>in</code> <code>`</code><code>cat</code> <code>$</code><code>file</code><code>`</code>

<code>  </code><code>echo</code> <code>"Visit beautiful $state"</code>

<code>[root@sh shell]</code><code># sh for4.sh </code>

<code>Visit beautiful shanghai</code>

<code>Visit beautiful beijing</code>

<code>Visit beautiful hangzhou</code>

<code>Visit beautiful nanjing</code>

<code>Visit beautiful guangzhou</code>

<code>[root@sh shell]</code><code># cat states </code>

<code>shanghai</code>

<code>beijing</code>

<code>hangzhou</code>

<code>nanjing</code>

<code>guangzhou</code>

1.5更改字段分隔符

空格;

制表符:

换行符

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

    要解决这个问题,你可以在你shell脚本中临时更改IFS环境变量的值来限制一下被bash shell当作字段分隔符的字符。但这种方式有点奇怪,比如,如果你行IFS的值使其只能识别换行符,你必须这么做:

    IFS=$'\n'

    将这个语句加入到脚本中,告诉bash shell在数据值中忽略空格和制表符。

<code>[root@sh shell]</code><code># cat for5.sh </code>

<code>file</code><code>=</code><code>"states"</code>

<code>IFS=$</code><code>'\n'</code>

<code>[root@sh shell]</code><code># sh for5.sh </code>

<code>Visit beautiful guang zhou</code>

<code>Visit beautiful nan ning</code>

<code>Visit beautiful jiang nan</code>

在处理长脚本中,可能在一个地方需要修改IFS的值,然后忘掉它在脚本中其他地方还原默认值。

    例如:

        IFS.OLD=$IFS

        IFS=$'\n'

        &lt;use the new IFS value in code&gt;

        IFS=$IFS.OLD

其他的IFS值,如:在/etc/passwd中可能用到

    IFS=:

也可以赋值多个IFS:

    IFS=$'\n:;"'

1.6用通配符读取目录

<code>[root@sh shell]</code><code># cat for6.sh </code>

<code>for</code> <code>file</code> <code>in</code> <code>/home/</code><code>*</code>

<code>  </code><code>if</code> <code>[ -d </code><code>"$file"</code> <code>];</code><code>then</code>

<code>    </code><code>echo</code> <code>"$file is a directory"</code>

<code>  </code><code>elif</code> <code>[ -f </code><code>"$file"</code> <code>];</code><code>then</code>

<code>    </code><code>echo</code> <code>"$file is a file"</code>

<code>  </code><code>fi</code>

<code>[root@sh shell]</code><code># sh for6.sh </code>

<code>/home/apache-tomcat-8</code><code>.0.28.</code><code>tar</code><code>.gz is a </code><code>file</code>

<code>/home/dir1</code> <code>is a directory</code>

<code>/home/dir2</code> <code>is a directory</code>

<code>/home/fie1</code> <code>is a </code><code>file</code>

<code>/home/fie2</code> <code>is a </code><code>file</code>

<code>/home/fie22</code> <code>is a </code><code>file</code>

<code>[root@sh shell]</code><code># cat for7.sh </code>

<code>for</code> <code>file</code> <code>in</code> <code>/home/</code><code>* </code><code>/home/badtest</code>

<code>  </code><code>else</code>

<code>    </code><code>echo</code> <code>"$file doesn't exist"</code>

<code>[root@sh shell]</code><code># sh for7.sh </code>

<code>/home/badtest</code> <code>doesn't exist</code>

二、C语言风格的for命令

2.1 C语言风格的for命令

    C语言的for命令有一个用来指明变量的特殊方法、一个必须保持成立才能继续迭代的条件,以及另一个为每个迭代改变变量的方法。当指定的条件不成立时,for循环就会停止。条件等式通过标准的数字符号定义。

    for (i=0; i&lt;10; i++)

    {

        printf("The next number is %d\n",i):

    }

    第一部分将一个默认值赋给该变量,中间的部分定义了循环重复的条件,当定义的条件不成立时,for循环就停止迭代,最后一部分定义了迭代的过程。

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

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

    for (( a = 1; a &lt; 10; a++ ))

本文转自 HMLinux 51CTO博客,原文链接:http://blog.51cto.com/7424593/1738811

继续阅读