在此脚本中,我只是想知道为什么变量$ line周围需要双引号
$cat script1
#!/bin/bash
exec 3<$1
exec 4<$2
exec 5>$3
while read line <&3
do
echo "$line" >&5
done
while read line <&4
do
echo "$line" >&5
done
答案 0 :(得分:2)
如果您不想扩展空格(IFS字符,默认空格,制表符和换行符),则需要在行周围加引号。观察:
printf "a b\n" |
while read line; do
echo $line
done
这将输出:
a b
使用qoutes:
printf "a b\n" |
while read line; do
echo "$line"
done
将输出:
a b
行情禁止外壳扩展。抢好read on quotes。另请阅读有关IFS的信息,并注意read
分隔符-d
选项和-r
选项。
如果您希望从文件中读取内容,并保留前导和尾随空格以及整行,请参见here并使用:
while IFS= read -r line; do
echo "$line"
done
还要注意,使用while read
循环解析文件在bash上非常慢。尝试使用bash命令以及moreutils和标准的unix命令来分析文件。如果您确实需要逐行分析文件,那么xargs和parallel
就是很好的程序。您呈现的脚本可能只是被cat "$1" "$2" >"$5"
替代(或更像cat "$1" "$2" | sed 's/^[ \t]*//;s/[ \t]*$//' > "$5"
,因为前导和尾随的空白将不会保留)。
还引用您的变量。如果有人用名称中带有空格的文件来校准您的函数,则exec 3<$1
将失败,例如:./script1 "filename with spaces.txt"
。使用exec 3<"$1"
。