for命令:

for  var  in  list

do

    command

done

例:

for  var  in  one  two  three  four

do

    echo $var

done

注意1:var的值会保持到脚本的最后,var的值为循环列表的最后一个值。

注意2:列表中的每个值是以空格区分的,可以用双引号包含空格或单引号的值。


读取的list也可以是一个变量:

list="one  two  three"

list=$list  "four"

for  var  in  $list

do

    command

done


从命令读取值:

for  var  in  $( cat  demo.txt)

do

    echo $var

done

demo.txt文件中可以是一行一行的数据,但是每行之间的单词有空格也会当成两个列表值


更改字段分格符:

IFS        环境变量,内部字段分隔符,可以通过修改这个环境变量修改解析数据的规则

IFS.OLD=IFS      修改之前先保存默认值

IFS=$'\n':;"        这个值会将换行符、冒号、分号、双引号作为字段分隔符,如何使用IFS字符解析数据没有任何限制。

例:

IFS.OLD=IFS

IFS=$'\n'

for  var  in  $( cat demo.txt )

do

    echo var;

done

IFS=IFS.OLD

这样只有换行符才会被解析为新数据的开始


用通配符读取目录:

for  file  in  $HOME/*   /home/Richard

do

    if  [ -d  "$file" ]  ;  then

        echo  "$file  is  a  dirctory"

    elif [ -f  "$file" ] ; then

        echo  "$file  is  a  file"

    fi

done

注意:在in后面可以使用多个目录通配符。

注意:为防止目录或文件名有空格,在输出时要用双引号包含变量,例:"$file"。


C语言风格的for命令:

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

do

    echo "The  var  is  $i ";

done

注意:1.等于号两遍可以有空格。2.括号中的变量不以美元符号开头。


遍历/etc/passwd示例:

IFS.OLD=IFS

IFS=$'\n'

for  line  in  $( cat  /etc/passwd )

do

        echo  "line  $line"

        IFS=:

        for  word  in  $line

        do

                echo "word  $word"

        done

done


查找可执行命令示例:

所有可执行的命令都放在$PATH定义的中,所以只要在这些目录中查找可执行命令就行了

IFS.OLD=IFS

IFS=:

for directory in $PATH

do

        echo "current directory id  $directory"

        for file in $directory/*

        do

                if [ -x $file ]; then

                        echo "The file $file can execute"

                else

                        echo "The file $file cat not execute"

                fi

        done

done


总结:

for  var  in  1 2 3 4 5               普通列表

for  var  in  $( cat demo.txt )  命令替换

for  var  in  /root/bin/*           使用通配符

for  ((  i = 0 ; i < 10 ; i++  ))    括号内同C语言