При чтении строки с использованием цикла While в bash она сжимает несколько пробелов в один - PullRequest
0 голосов
/ 17 февраля 2019

Я пишу сценарий оболочки для чтения количества пустых мест в файл.

Я использую следующий шаблон для чтения строки одну за другой

 while read l 
 do

 done <filename

, но он преобразует несколькопробелы в один пробел при чтении строки.

1 Ответ

0 голосов
/ 17 февраля 2019

Акаш, у вас проблемы, потому что вы не в состоянии процитировать ваши переменные, которые вызывают разбиение слов вывода из 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"
...