2015-03-01 4 views
0

Многие люди показали, как сохранить пробелы при чтении строки в bash. Но у меня есть алгоритм, основанный на символах, который должен обрабатывать каждый конец каждого символа отдельно - включенные пробелы. К сожалению, я не могу получить bash, чтобы прочитать пробел .Как читать пробел в bash - читать не будет

while read -r -n 1 c; do printf "[%c]" "$c" done <<< "mark spitz" printf "[ ]\n"

дает

[m][a][r][k][][s][p][i][t][z][][ ]

Я взломал свой путь вокруг этого, но было бы неплохо, чтобы выяснить, как читать один любой одного символа. Да, попытался установить IFS и т.д.

ответ

1

Просто установите разделитель поля ввода (а) так, что она не рассматривает пространство (или любой символ) в качестве разделителя, который работает просто отлично:

printf 'mark spitz' | while IFS="" read -r -n 1 c; do 
    printf "[%c]" "$c" 
done 
echo 

это дает:

[m][a][r][k][ ][s][p][i][t][z] 

вы заметите, что я также немного изменился, как вы получаете вход там, <<< кажется, не обеспечивает посторонний характер в конце, и, пока она не t важно для самого метода ввода, но, хотя лучше всего изменить это, чтобы избежать путаницы.


(а) Да, я в курсе, что вы сказал вы уже пробовали настройки IFS, но, так как вы сделали на самом деле не показывают как вы пробовали это, и это, кажется чтобы нормально работать, как я это делаю, я должен предположить, что вы, возможно, только что сделали что-то не так.

+0

Ничего себе. У меня, должно быть, была вторая проблема, не ссылаясь на переменную в присваивании или выходе (whitespace - это моя ошибка в bash), и когда я попытался это исправить, это произошло из-за второй проблемы. Показывает ценность сокращения тестов до минимума - вместо того, чтобы пытаться исправить в вашей большой программе! – user3546411

+0

BTW с использованием 'while read do done <<<" input "' важно, потому что я остаюсь в одной оболочке и имею доступ к пространству имен оболочки. Вход 'printf" | в то время как make done порождает подоболочку, которая имеет как другое пространство имен и не может легко перемещать данные назад и вперед между блоком do и вызывающей родительской оболочкой. – user3546411