变量和双引号

时间:2018-10-10 08:19:37

标签: linux shell unix

在此脚本中,我只是想知道为什么变量$ 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

1 个答案:

答案 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命令来分析文件。如果您确实需要逐行分析文件,那么xargsparallel就是很好的程序。您呈现的脚本可能只是被cat "$1" "$2" >"$5"替代(或更像cat "$1" "$2" | sed 's/^[ \t]*//;s/[ \t]*$//' > "$5",因为前导和尾随的空白将不会保留)。

还引用您的变量。如果有人用名称中带有空格的文件来校准您的函数,则exec 3<$1将失败,例如:./script1 "filename with spaces.txt"。使用exec 3<"$1"