[linux] 结构化命令-for
1 for命令
1 # for:迭代循环;默认空格为分隔符 2 3 for var in list 4 do 5 commands 6 done
1.1 读取列表中的值
#!usr/bin/bash for test in Hello Python Student School do echo The next wprd is $test done echo The last state is $test #一直保持最后迭代的值,除非删除(或更改)它
1.2 读取列表中复杂的值
1 # 使用转义字符(反斜线),转义特殊字符 2 # 使用双引号定义用到的单引号(或反之) 3 # 默认空格为分隔符 4 #!usr/bin/bash 5 for test in I don\'t know if "this'll" work 6 do 7 echo "word: $test" 8 done
# 双引号创建字符串变量,并作为一个整体出现在列表中 $cat fortest01.sh #!usr/bin/bash for var in "the test bash shell" do echo word: $var done $sh fortest01.sh word: the test bash shell $cat fortest01.sh #!usr/bin/bash for var in "the test bash shell" "the last test" do echo word: $var done $sh fortest01.sh word: the test bash shell word: the last test
1.3 从变量中读取列表
1 # 注意与直接读取列表的区别: 2 # 列表: 3 * 列表中特殊字符的转义字符 4 * 双引号-特殊字符和字符串变量(整体) 5 # 变量 6 * 定义字符串变量-双引号/单引号 7 * 字符串添加元素 8 * for迭代遍历变量元素 9 $cat varfortest02.sh 10 #!usr/bin/bash 11 list01='the first test example' 12 list02=" the second test example" 13 list03=$list02" the thrid test example" 14 list04=$list01$list02$list03 15 echo $list04 16 n=0 17 for var in $list04 18 do 19 (( n++ )) 20 echo cycle $n: $var 21 done 22 23 $sh varfortest02.sh 24 the first test example the second test example the second test example the thrid test example 25 cycle 1: the 26 cycle 2: first 27 cycle 3: test 28 cycle 4: example 29 cycle 5: the 30 cycle 6: second 31 cycle 7: test 32 cycle 8: example 33 cycle 9: the 34 cycle 10: second 35 cycle 11: test 36 cycle 12: example 37 cycle 13: the 38 cycle 14: thrid 39 cycle 15: test 40 cycle 16: example
1.4 从命令读取值
1 # 反引号 2 * 使用文件的绝对路径,除非位于同一个目录 3 * 默认空格为分隔符 4 $cat commandfor.sh 5 #!usr/bin/bash 6 n=0 7 for var in `cat varfortest02.sh` 8 do 9 n=$[ $n+1 ] 10 echo line $n: $var 11 done 12 13 $sh commandfor.sh 14 line 1: #!usr/bin/bash 15 line 2: list01='the 16 line 3: first 17 ... ... 18 line 24: do 19 line 25: (( 20 line 26: n++ 21 line 27: )) 22 ... ... 23 line 31: $var 24 line 32: done
1.5 更改字段分隔符
1 # 环境变量IFS-内部字段分隔符 2 * 默认分隔符:空格;制表符;换行符 3 * 更改:单个:IFS=$'\n'-(换行) 4 多个:IFS=$'\n:;"'-(换行/冒号/分号/双引号) 5 * 保存与恢复: 6 IFS.OLD=$IFS 7 IFS=$'\n' 8 ... 9 IFS=$IFS.OLD 10 11 $cat commandfor.sh 12 #!usr/bin/bash 13 n=0 14 IFS.OLD=$IFS 15 IFS=$'\n' 16 for var in `cat varfortest02.sh` 17 do 18 n=$[ $n+1 ] 19 echo line $n: $var 20 done 21 IFS=$IFS.OLD 22 23 $sh commandfor.sh 24 commandfor.sh: line 3: IFS.OLD=: command not found 25 line 1: #!usr/bin/bash 26 line 2: list01='the first test example' 27 line 3: list02=" the second test example" 28 line 4: list03=$list02" the thrid test example" 29 line 5: list04=$list01$list02$list03 30 line 6: echo $list04 31 line 7: n=0 32 line 8: for var in $list04 33 line 9: do 34 line 10: (( n++ )) 35 line 11: echo cycle $n: $var 36 line 12: done
1.6 用通配符读取文件/目录
1 # 文件/目录变量尽量用双引号括起来 2 # 文件/目录查找方法和列表方法合并进同一个for语句
* 可以添加任意多个通配符,for语句先匹配文件或目录形成列表,然后遍历列表 3 $cat filefor.sh 4 #!usr/bin/bash 5 for file in ./* ./tsttst 6 do 7 if [ -e "$file" ] 8 then 9 echo The file is $file 10 else 11 echo The fiel $file do not exist! 12 fi 13 done 14 15 $sh filefor.sh 16 The file is ./commandfor.sh 17 The file is ./filefor.sh 18 The file is ./fortest01.sh 19 The file is ./varfortest02.sh 20 The fiel ./tsttst do not exist!