【问题标题】:When reading a line using While loop in bash, it's squezzing multiple space into one在 bash 中使用 While 循环读取一行时,它会将多个空间压缩为一个
【发布时间】:2019-02-17 07:22:14
【问题描述】:

我正在编写一个 shell 脚本来读取文件中的空格数。

我正在使用以下模板逐行阅读

 while read l 
 do

 done <filename

但它在读取一行时将多个空格转换为一个空格。

【问题讨论】:

  • while IFS= read l ...
  • 您遗漏了重要部分。你如何使用这个变量?
  • while IFS= read -r l do echo $l echo $l>temp wc -L temp|cat >length len=cut -d " " -f 1 length echo $len done
  • 你必须引用你的变量。 echo "$l" 否则当你 echo 时会发生分词...

标签: bash shell unix quoting


【解决方案1】:

Akash,您遇到了问题,因为您没有引用变量,这会导致echo(以及任何其他命令)的输出分词,给人的印象是空格是没有保存。为了纠正这个问题,总是引用你的变量,例如

#!/bin/bash

while IFS= read -r l 
do
    echo "$l"
    echo "$l" > tempf
    wc -L tempf | cat > length
    len=$(cut -d " " -f 1 length)
    echo "$len"
done < "$1"

输入文件示例

$ cat fn
who -all
           system boot  2019-02-13 10:27
           run-level 5  2019-02-13 10:27
LOGIN      tty1         2019-02-13 10:27              1389 id=tty1
david    ? :0           2019-02-13 10:27   ?          3118
david    - console      2019-02-13 10:27  old         3118 (:0)

使用/输出示例

$ bash readwspaces.sh fn
who -all
8
           system boot  2019-02-13 10:27
40
           run-level 5  2019-02-13 10:27
40
LOGIN      tty1         2019-02-13 10:27              1389 id=tty1
66
david    ? :0           2019-02-13 10:27   ?          3118
58
david    - console      2019-02-13 10:27  old         3118 (:0)
63

此外,您可以将脚本缩短为:

#!/bin/bash

while IFS= read -r l 
do
    printf "%s\n%d\n" "$l" "${#l}"
done < "$1"

【讨论】:

  • 是的。当您不在变量引用周围加上双引号时,这只是可能出错的众多事情之一。
  • 我也不能说我从来没有对自己做过:),但是在大约第 10 次之后它开始沉入...
  • 非常感谢@DavidC.Rankin。它就像一个魅力。
  • 很高兴它有帮助。祝你的脚本好运。
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2015-01-04
  • 2019-01-11
相关资源
最近更新 更多