1. for命令
下面是bash shell中for命令的基本格式。
for var in list docommands
done
每次for命令遍历值列表,它都会将列表中的下个值赋给$test
变量。$test
变量可以像for 命令语句中的其他脚本变量一样使用。在最后一次迭代后,$test
变量的值会在shell脚本的剩余 部分一直保持有效。它会一直保持最后一次迭代的值(除非你修改了它)。
$ cat for_test.sh
#!/bin/bash
for test in Alabama Alaska Arizona Arkansas California
doecho The text next state is $test
done
echo "The last state we visited was $test"
test=hello
echo "Wait, now we're visiting $test"$ bash for_test.sh
The text next state is Alabama
The text next state is Alaska
The text next state is Arizona
The text next state is Arkansas
The text next state is California
The last state we visited was California
Wait, now we're visiting hello
从变量中读取值
#!/bin/bash 13
# using a variable to hold the list
list="Alabama Alaska Arizona Arkansas Colorado"
list=$list" Connecticutfor state in $list
doecho "Have you ever visited $state?"
done
从命令中读取
$ cat test5
#!/bin/bash
# reading values from a file
file="states"
for state in $(cat $file)
doecho "Visit beautiful $state"
done
更改字段分隔符
特殊的环境变量IFS
,叫作内部字段分隔符(internal field separator)
。IFS
环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字 符当作字段分隔符:
- 空格
- 制表符
- 换行符
可以在shell脚本中临时更改IFS环境变量
的值来限制被bash shell当作字段 分隔符的字符。
IFS=$'\n'
用通配符读取目录
$ cat test6
#!/bin/bash
for file in /home/rich/test/*
doif [ -d "$file" ]thenecho "$file is a directory"elif [ -f "$file" ]thenecho "$file is a file"fi
done
$ ./test6
/home/rich/test/dir1 is a directory
/home/rich/test/myprog.c is a file
/home/rich/test/myprog is a file
/home/rich/test/myscript is a file
/home/rich/test/newdir is a directory
/home/rich/test/newfile is a file
/home/rich/test/newfile2 is a file
/home/rich/test/testdir is a directory
/home/rich/test/testing is a file
/home/rich/test/testprog is a file
/home/rich/test/testprog.c is a file
1.1 类C语言for语句
C语言风格的for命令看起来如下
for (( a = 1; a < 10; a++ ))
注意,有些部分并没有遵循bash shell标准的for命令:
- 变量赋值可以有空格;
- 条件中的变量不以美元符开头;
- 迭代过程的算式未用expr命令格式。
以下例子是在bash shell程序中使用C语言风格的for命令。
$ cat test8
#!/bin/bash
# testing the C-style for loop
for (( i=1; i <= 10; i++ ))
doecho "The next number is $i"
done
$ ./test8
The next number is 1
The next number is 2
The next number is 3
The next number is 4
The next number is 5
The next number is 6
The next number is 7
The next number is 8
The next number is 9
The next number is 10
$
2. while命令
while命令的格式是:
while testcommand doother commands
done
while命令的关键在于所指定的test command的退出状态码必须随着循环中运行的命令而
改变。如果退出状态码不发生变化, while循环就将一直不停地进行下去。
最常见的test command的用法是用方括号来检查循环命令中用到的shell变量的值。
$ cat test10
#!/bin/bash
# while command test
var1=10
while [ $var1 -gt 0 ]
do
echo $var1var1=$[ $var1 - 1 ]
done
$ ./test10
10
9
8
7
6
5
4
3
2
1
$