shell脚本编程系列
for var in list
do
commands
done
读取列表中的值
每次遍历值列表时,for命令会将列表中的下一个值赋值给变量
#!/bin/bash
# basic for command
for test in Alabama Alaska Arizona Arkansas California Colorado
do
echo The next state is $test
done
在最后一次迭代结束后,变量的值在shell脚本的剩余部分依然有效,会一直保留最后一次迭代时的值,当然可以修改
#!/bin/bash
# testing the for variable after the looping
for test in Alabama Alaska Arizona Arkansas California Colorado
do
echo "The next state is $test"
done
echo "The last state we visited was $test"
test=Connecticut
echo "Wait, now we're visiting $test"
读取列表中的复杂值
单词中包含了单引号会导致一团糟,比如this’ll,此时要么使用转义字符来转义单引号,要么使用双引号来定义含有单引号的值
#!/bin/bash
# another example of how not to use the for command
for test in I don\'t know if "this'll" work
do
echo "word:$test"
done
for命令默认使用空格来划分列表中的值,如果某个值包含有空格,则必须将其放到双引号内
#!/bin/bash
# an example of how to properly define values
for test in Nevada "New Hampshire" "New Mexico" "New York"
do
echo "Now going to $test"
done
从变量中读取值列表
可以将值列表保存到变量中,然后进行拼接操作,再通过for命令读取
#!/bin/bash
# using a variable to hold the list
list="Alabama Alaska Arizona Arkansas Colorado"
list=$list" Connecticut"
for state in $list
do
echo "Have you ever visited $state?"
done
从命令中读取值列表
使用命令替换来执行任何能产生输出的命令,然后使用for命令使用该命令的输出
#!/bin/bash
# reading values from a file
file="states"
for state in $(cat $file)
do
echo "Visit beautiful $state"
done
更改字段分隔符
默认的字段分隔符由特殊的环境变量IFS(internal field separator 内部字段分隔符)来确定。默认值为空格、制表符、换行符(IFS=$’ \t\n’)
可以修改IFS的值,如果要制定多个IFS字符,则只需在赋值语句中将这些字符写在一起即可
IFS=: # 将冒号设置为字段分隔符
IFS=$' \n:;"' # 将换行符、冒号、分号和双引号作为字段分隔符
修改IFS的值,需要注意恢复原来的值,保证安全
IFSOLD=$IFS
IFS=:
结束时替换回去
IFS=$IFSOLD
使用通配符读取目录
可以使用for命令来自动遍历目录中的文件,但是必须在文件名和路径名中使用通配符,这会强制文件名通配符匹配(file globbing)。文件名通配符是生成与指定通配符匹配的文件名或路径名的过程。
遍历的对象可以是多个文件名通配符
#!/bin/bash
# iterating through multiple directories
for file in /home/rich/.b* /home/rich/badtest
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
else
echo "$file doesn't exist"
fi
done
C语言风格的for语句
for (( variable assignment ; condition ; iteration processs ))
C语言风格,有些地方与bash shell标准的for命令并不一样
- 变量赋值可以有空格
- 迭代条件中的变量不以美元符号开头
- 迭代过程的算式不使用expr命令格式
#!/bin/bash
# testing the C-style for loop
for (( i=1; i <= 10; i++ ))
do
echo "The next number is $i"
done
还支持多个变量
#!/bin/bash
# multiple variables
for (( a=1, b=10; a <= 10; a++, b-- ))
do
echo "$a - $b"
done