如果想出发,就不要等到明天!
全部博文(317)
分类: LINUX
2013-05-03 14:08:38
1) for 循环与列表分隔符;1. for 循环与列表分隔符:
2)while 循环;
3)until 循环;
Linux shell 中 for 循环用于处理列表的循环遍历;
1.1 for循环的用法:
example:
- for var in list; #list 可以是一个字符串或者一个字符序列
- do
- 执行代码; #使用$var变量对list进行遍历
- done
- echo -e "\e[42;31m --- Iterate the contents of out.txt!\e[0m";
- echo 1 > out.txt;
- echo 2 >> out.txt;
- echo 3 >> out.txt;
- echo 4 >> out.txt;
- echo 5 >> out.txt;
- counter=0;
- for item in $(cat out.txt);
- do
- echo "Item: $item";
- let counter++;
- done
- echo "counter:$counter";
1.2 for 循环的列表分隔符:
Linux shell 里面有个十分重要的环境变量 IFS (Internal Field Separator),这个变量用作处理字符串时的默认分隔字符;
先上代码,看看这个 $IFS 到底是何方神圣!
example 1:
- echo -e "\e[42;31m --- Use default \$IFS to iterate the contents of out.txt! ---\e[0m";
- echo -e "\e[1;33mDefault \$IFS=\"$IFS\"\e[0m";
- counter=0;
- for item in $(cat out.txt);
- do
- echo "Item: $item";
- let counter++;
- done
- echo "counter:$counter";
由上面黄色的字体的输出可见,$IFS 的默认值为一个换行字符;
因为 out.txt 使用 echo 进行初始化的,共有 5 行,所以我们看到当我们使用默认的 $IFS 分隔符对 cat out.txt 的标准输出 stdout 进行遍历时,一共循环了 5 次;
example 2:
- echo -e "\e[42;31m --- Change the internal field seperator \$IFS to comma!\e[0m";
- echo -e "\e[1;32m --- Use comma as \$IFS to iterate the contents of out.txt! ---\e[0m";
- counter=0;
- oldIFS=$IFS;
- IFS=,;
- for item in $(cat out.txt);
- do
- echo "Item: $item";
- let counter++;
- done
- IFS=$oldIFS;
- echo "counter:$counter";
由本次的运行结果看出,循环运行了一次,“Item”输出了一次;
因为本次代码里面我们把 $IFS 的值改成了 “," ,而 cat out.txt 的输出并不带逗号,所以就把所有输出作为一个整体输出;
因此我们只看到循环进行了一次;
example 3:
- echo -e "\e[1;32m --- Use comma as \$IFS to iterate a custom list! ---\e[0m";
- counter=0;
- oldIFS=$IFS
- IFS=,
- data="name,sex,rollno,location"
- for item in $data;
- do
- echo "Item: $item";
- let counter++;
- done
- IFS=$oldIFS
- echo "counter:$counter";
这次我们使用"," 作为 $IFS 的值去遍历一个以","作为分隔符的列表 data;
由运行结果看出,循环进行了 5 次;
1.3 为 for 构建循环条件列表:
for 循环里面的 list 可以自行构建,构建方法如下:
example:
- {1..50} or {a..z} or {A..Z}
for 循环遍历数字与字母构成的列表:
- echo -e "\e[42;31m--- for iteration in one number sequence! ---\e[0m";
- counter=0;
- for i in {1..5};
- do
- echo $i;
- let counter++;
- done;
- echo "counter=$counter";
- echo -e "\e[42;31m--- for iteration in one characters sequence! ---\e[0m";
- counter=0;
- for i in {A..z};
- do
- printf "$i";
- let counter++;
- done;
- echo;
- echo "counter:$counter";
1.4 for 同样支持 C 语言风格的循环:
用法:
这里值得注意的是 for 的循环条件使用双括号 (()) ;
- for((i=0;i<10;i++))
- {
- 执行代码;
- }
2. while 循环:example:
- echo -e "\e[42;31m--- for iteration in \"C\" style! ---\e[0m";
- for(( i = 0 ,counter = 0;i<=10; i++,counter++))
- {
- printf "%d " $i;
- }
- echo;
- echo "counter:$counter";
Linux shell 支持 while 风格的循环,只要循环条件为真,就不断循环执行,用法如下:3. until 循环:
example:
- while 循环条件
- do
- 执行代码;
- done
- echo -e "\e[42;31m--- while iteration for counter! ---\e[0m";
- counter=0;
- while [ $counter -lt 5 ];
- do
- let counter++;
- done
- echo "counter:$counter";
until 循环是我在 linux shell 中第一次见到的一种特殊循环,循环代码会一直执行,直到循环条件为真才停止;
用法如下:
example:
- until 循环停止条件;
- 执行代码;
- done
- echo -e "\e[42;31m--- until iteration for counter! ---\e[0m";
- counter=0;
- until [ $counter -eq 7 ];
- do
- let counter++;
- printf "%d " $counter;
- done
- echo -e "\ncounter:$counter";