2014-01-15 2 views
0

Я хочу, чтобы прочитать строку из файла и распечатать его следующим образом:читает строку из файла

LINE=tr '\n' ' ' < $FILENAME 
x1=$LINE 
echo $LINE 

но дисплей команды echo $LINE пустой строки?

+0

Теперь говорят, что это даст ошибку, не так ли? Используйте подстановку команд. – devnull

ответ

2

Как уже отмечалось другими плакатами, чтобы встроить вывод команды tr в другую команду (в данном случае LINE=...), окружают команду tr от $(...). В bash это называется command substitution.

LINE=$(tr '\n' ' ' < "$FILENAME") 

В случае, если вы собираетесь использовать $LINE как последовательность параметров для последующих команд (в данном случае echo), то символы новой строки в конечном итоге заменить пространства во word splitting. Это сделало бы tr излишним; Вы могли бы также сделать это:

LINE=$(cat "$FILENAME") 

или даже лучше:

LINE=$(< "$FILENAME") 

Слово расщепления не является эффективным в двойных кавычках; поэтому echo "$LINE" все равно потребует tr для удаления новых строк.

+0

'$ (...)' НЕ заменяет новые строки пробелами - единственное, что он делает, это обрезать * завершающие * новые строки (как многие из них). Поэтому ваши альтернативные решения не работают должным образом. Кроме того, пожалуйста, дважды укажите ссылки '$ FILENAME'. – mklement0

+0

@ mklement0: Вы правы; правда об исчезновении новых строк немного сложнее. Я сделал изменение, чтобы перефразировать это. –

+1

Спасибо за редактирование, но важно отметить, что разделение слов НЕ участвует во время * присваивания переменной * - если в содержимом '$ FILENAME' есть * interior * newlines, они * будут * в конечном итоге в значении' $ LINE'. Только когда вы позже * указываете * '$ LINE' * без цитирования *, что происходит разделение слов - вместе с другими расширениями оболочки, такими как globbing, что может быть или не быть желательным. – mklement0

2

Вы должны использовать подстановку команды как это:

LINE=$(tr '\n' ' ' < "$FILENAME") 

Но это будет хранить ТР выходные в LINE переменной.

+0

проблема была исправлена, но что такое различие? – user3137879

+0

'Command substitution' имеет синтаксис, который является либо обратным тиком ИЛИ' $ (..) ' – anubhava

+2

@ user3137879: Если вы назначаете без' $ (...) '(или обратных ссылок), вы присваиваете * строковый литерал * к 'LINE'. Подстановка команды означает, что строка, заключенная в '$ (...)', интерпретируется как команда и выполняется, а ее * результат * присваивается 'LINE'. – mklement0

1

Я думаю, вам нужно поставить вызов команды tr с обратными кавычками:

LINE=`tr '\n' ' ' < $FILENAME` 
+2

Работает, но использование backquotes устарело в пользу синтаксиса '$ (...)', последнее имеет то преимущество, что оно может быть вложен. – mklement0

Смежные вопросы