20.2 重定向代码块
#!/bin/bash
# redir2.sh
if [ -z "$1" ]
then
Filename=names.data # 如果不指定文件名的默认值.
else
Filename=$1
fi
#+ Filename=${1:-names.data}
# can replace the above test (parameter substitution).
count=0
echo
while [ "$name" != Smith ] # 为什么变量 "$name" 加引号?
do
read name # 从 $Filename 读取值, 而不是 标准输入.
echo $name
let "count += 1"
done <"$Filename" # 重定向标准输入到文件 $Filename.
# ^^^^^^^^^^^^
echo; echo "$count names read"; echo
exit 0
# 注意在一些老的脚本语言中,
#+ 循环的重定向会跑在子 shell 的环境中.
# 因此, $count 返回 0, 在循环外已经初始化过值.
# Bash 和 ksh *只要可能* 会避免启动子 shell ,
#+ 所以这个脚本作为样例运行成功.
# (感谢 Heiner Steven 指出这点.)
# 然而 . . .
# Bash 有时候 *能* 在 "只读的 while" 循环启动子进程 ,
#+ 不同于 "while" 循环的重定向.
abc=hi
echo -e "1\n2\n3" | while read l
do abc="$l"
echo $abc
done
echo $abc
# 感谢, Bruno de Oliveira Schneider 上面的演示代码.
# 也感谢 Brian Onn 纠正了注释的错误.Last updated