Я хочу, чтобы прочитать строку из файла и распечатать его следующим образом:читает строку из файла
LINE=tr '\n' ' ' < $FILENAME
x1=$LINE
echo $LINE
но дисплей команды echo $LINE
пустой строки?
Я хочу, чтобы прочитать строку из файла и распечатать его следующим образом:читает строку из файла
LINE=tr '\n' ' ' < $FILENAME
x1=$LINE
echo $LINE
но дисплей команды echo $LINE
пустой строки?
Как уже отмечалось другими плакатами, чтобы встроить вывод команды tr
в другую команду (в данном случае LINE=...
), окружают команду tr
от $(...)
. В bash это называется command substitution.
LINE=$(tr '\n' ' ' < "$FILENAME")
В случае, если вы собираетесь использовать $LINE
как последовательность параметров для последующих команд (в данном случае echo
), то символы новой строки в конечном итоге заменить пространства во word splitting. Это сделало бы tr
излишним; Вы могли бы также сделать это:
LINE=$(cat "$FILENAME")
или даже лучше:
LINE=$(< "$FILENAME")
Слово расщепления не является эффективным в двойных кавычках; поэтому echo "$LINE"
все равно потребует tr
для удаления новых строк.
'$ (...)' НЕ заменяет новые строки пробелами - единственное, что он делает, это обрезать * завершающие * новые строки (как многие из них). Поэтому ваши альтернативные решения не работают должным образом. Кроме того, пожалуйста, дважды укажите ссылки '$ FILENAME'. – mklement0
@ mklement0: Вы правы; правда об исчезновении новых строк немного сложнее. Я сделал изменение, чтобы перефразировать это. –
Спасибо за редактирование, но важно отметить, что разделение слов НЕ участвует во время * присваивания переменной * - если в содержимом '$ FILENAME' есть * interior * newlines, они * будут * в конечном итоге в значении' $ LINE'. Только когда вы позже * указываете * '$ LINE' * без цитирования *, что происходит разделение слов - вместе с другими расширениями оболочки, такими как globbing, что может быть или не быть желательным. – mklement0
Вы должны использовать подстановку команды как это:
LINE=$(tr '\n' ' ' < "$FILENAME")
Но это будет хранить ТР выходные в LINE
переменной.
проблема была исправлена, но что такое различие? – user3137879
'Command substitution' имеет синтаксис, который является либо обратным тиком ИЛИ' $ (..) ' – anubhava
@ user3137879: Если вы назначаете без' $ (...) '(или обратных ссылок), вы присваиваете * строковый литерал * к 'LINE'. Подстановка команды означает, что строка, заключенная в '$ (...)', интерпретируется как команда и выполняется, а ее * результат * присваивается 'LINE'. – mklement0
Я думаю, вам нужно поставить вызов команды tr
с обратными кавычками:
LINE=`tr '\n' ' ' < $FILENAME`
Работает, но использование backquotes устарело в пользу синтаксиса '$ (...)', последнее имеет то преимущество, что оно может быть вложен. – mklement0
Теперь говорят, что это даст ошибку, не так ли? Используйте подстановку команд. – devnull