for … in …
- 基本用法
#!/bin/bash
for test in alibaba baidu tenxiu didi
do
echo "the next state is $test"
done
echo "Thes last state is $test"
test="修改"
echo "now, Thes state is $test"
每次for命令遍历值列表,它都会将列表中的下个值赋给
t
e
s
t
变
量
。
test变量。
test变量。test变量可以像for
命令语句中的其他脚本变量一样使用。在最后一次迭代后,$test变量的值会在shell脚本的剩余部分一直保持有效。它会一直保持最后一次迭代的值(除非你修改了它)
- 特殊字符
如果遇到特殊字符,比如单引号、空格,应该:
使用转义字符(反斜线)来将单引号转义;
使用双引号来定义用到单引号的值。
#!/bin/bash
for test in I don\'t konw "this'll" work
do
echo "the next state is $test"
done
- 更改字段分隔符
这和环境变量内部字段分隔符IFS有关。IFS环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当作字段分隔符:
空格
制表符
换行符。
我们可以在脚本中自定义临时修改IFS
#!/bin/bash
IFS_OLD=$IFS
IFS=$'\n'
for test in $(ls -l)
do
echo "the next state is $test"
done
IFS=$IFS_OLD
IFS=: #将冒号作为字段分隔符
IFS=$'\n':;" #将换行符、冒号、分号和双引号作为字段分隔符
- 用通配符读取目录
#!/bin/bash
for file in /home/ocean/.b* /home/ocean/workspace/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done
- c风格的for
#!/bin/bash
for (( i=1; i <= 10; i++ ))
do
echo "The next number is $i"
done
#!/bin/bash
for (( a=1, b=10; a <= 10; a++, b-- ))
do
echo "$a - $b"
done
while
直到条件不满足才结束循环
- 基本用法
#!/bin/bash
var=10
while [ $var -gt 0 ]
do
echo $var
var=$[ $var-1 ]
done
- 多个条件
#!/bin/bash
var=10
while echo $var
[ $var -gt 0 ]
do
var=$[ $var-1 ]
done
until
直到条件满足才结束循环
- 基本用法
#!/bin/bash
var=10
until [ $var -eq 0 ]
do
echo $var
var=$[ $var-1 ]
done
- 多个条件
#!/bin/bash
var=10
until echo $var
[ $var -eq 0 ]
do
var=$[ $var-1 ]
done
break&& continue
break会提前终止离break最近的那一层循环
break n:n指定了跳出循环的等级,从里到外数,最内层的是1
IFSOLD=$IFS
IFS=$'\n'
for entry in $(cat /etc/passwd)
do
echo "$entry"
IFS=:
for value in $entry
do
echo "$value"
done
break
done
IFS=IFSOLD
continue提前终止某一次循环
continue -n提前终止某一层的某一次循环
处理循环的输出
for file in /home/ocean/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
fi
done > out.txt
echo "finished"
#!/bin/bash
for state in "North Dakota" Connecticut Illinois Alabama Tennessee
do
echo "$state is the next place to go"
done | sort
echo "This completes our travels"
实例
系统中有哪些可执行文件
#!/bin/bash
IFS=:
for folder in $PATH
do
echo "$folder:"
for file in $folder/*
do
if [ -x $file ]
then
echo " $file"
fi
done
done
参考<Linux命令行与shell脚本编程大全.第3版>