2014-09-14 2 views
1

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

Это как мой образец небольшой код вид:

#!/bin/bash 
loop=1; 
while [ $loop -lt 5 ]; 
do 
echo "-" 
let loop=loop+1 
done 

Я также попытался с помощью опции -n эхо команды, но у меня нет выхода. Я заменил stmt-echo "-" на echo -n "-".

Желаемый результат: "-----"

Может кто-нибудь помочь мне в этом

+0

Как это связано с powershell? – Matt

+0

Я начинаю раковину. «Powershell» также появился в качестве предложений к тегам. Я действительно знаю разницу между оболочкой и powershell. – user3624000

+0

Вы всегда можете навести курсор на теги, и он даст вам описание. Я удалил тег и добавил [tag: bash], поэтому нужные люди найдут ваш вопрос. – Matt

ответ

3

Вы сказали, что пытались

echo -n "-" 

который должен работал. На самом деле, я подозреваю, что так оно и было.

Проблема может заключаться в том, что у вас нет новой строки в самом конце вывода. С переходом к

echo -n "-" 

ваш сценарий должен напечатать 5 - символов без символа новой строки. Вывод, возможно, был скроен приглашением оболочки, напечатанным после завершения вашего скрипта.

Как быстро тест, попробуйте добавить

sleep 5 

в конце сценария и посмотреть, если появится -----. Через 5 секунд посмотрите, что произойдет, когда будет напечатано следующее приглашение оболочки.

Попробуйте это:

#!/bin/bash 
loop=1; 
while [ $loop -lt 5 ] 
do 
    echo -n "-" 
    let loop=loop+1 
done 
echo "" 

Итоговые echo "" печатает только символ новой строки.

Некоторые другие вещи, чтобы отметить:

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

В коде вашего вопроса у вас есть место перед #!/bin/bash. #! распознается только в самом начале строки. Без действительной строки #! ваш скрипт будет выполнен по /bin/sh, а не по /bin/bash. В этом случае это, вероятно, не имеет значения, поскольку вы не используете какие-либо специфичные для bash функции. Возможно, это была ошибка, когда вы разместили вопрос, но не забудьте проверить свой фактический сценарий и удалить пространство, если оно есть.

Команда echo существует в разных версиях. Он встроен в большинство оболочек, а также доступен как отдельный исполняемый файл /bin/echo. Различные версии могут иметь тонко различное поведение, в котором они распознают параметры и синтаксис специальных символов. Поддержка опции -n для печати строки без прерывания новой строки, вероятно, почти универсальный.

Команда printf (аналогичная функции C printf()) также существует в нескольких реализациях, но ее поведение намного более последовательное. Безопаснее использовать printf, а не echo, если вы делаете что-то большее, чем печатание простого однострочного сообщения. Опять же, это, вероятно, не будет иметь значения в этом случае, но хорошо иметь в виду.

+0

Отступы имеют значение, но переводы строк также выполняются так, что ваш «; ... do» требует только «;» когда «do» включен в той же строке, что и «while», в противном случае новая строка будет достаточной. «Эхо» в конце обычно не должно быть «» «», если только вы не пытаетесь объяснить множество различных несовместимых реализаций «эха», и в этом случае «echo -n» не является надежным либо, только «echo ..stuff .. | tr -d» \ 012 '", если целью является реальная перекрестная unix-платформа. Конечно, он сказал «bash», поэтому вам, вероятно, не нужно будет использовать «tr». –

+0

@ AlexNorth-Keys: Вы правы в '' ', и я удалил его, но он кажется безвредным. Да, цель использования 'echo '" ', а не' echo', заключалась в том, чтобы использовать различные реализации 'echo'; Я думаю, что использовал версии, где 'echo' без аргументов ничего не печатал.Я * думаю *, что 'echo -n' более переносим, ​​чем' echo', без аргументов, но если вы заинтересованы в переносимости, вы, вероятно, должны использовать 'printf' (если вы не находитесь в * действительно * старой системе у которого его нет). Я не знаю, как переносимая 'tr' обработка синтаксиса' '\ 012''. –

+0

Tr работал везде, где я пробовал. echo не может полагаться на большую часть чего-либо в более широком пространстве unix - без аргументов, которые он не мог бы выводить, или новой строки, или пространства (!) и новой строки. Некоторые из них всегда добавляют пространство после последнего аргумента, некоторые - нет. Я бы с осторожностью относился к чему-либо с тире впереди, но синтаксис «-», указывающий на отсутствие дополнительных параметров, нельзя полагаться. Даже встроенное эхо в некоторых оболочках нельзя полагаться ... Sun используется для изменения в зависимости от вашего пути поиска, угадывая, есть ли у него предпочтительная семантика SysV или BSD. Хех. :-) –

0

Попробуйте следующие вместо вашего текущего оператора эхо:

эхо -e "-/c"

Опция -e позволяет эхо-сигналам принимать разделители, а/c останавливает вывод (в этом случае конечная новая строка, не хочу).

+0

Опция '-e' для' echo', вероятно, менее переносима, чем '-n'. –

+0

Как вы указали, OP использует bash, что означает, что он должен работать, хотя у него есть проблемы с переносимостью. Однако это может быть даже не проблемой OP, и решение/c будет работать плавно. – player3

1

Вы должны использовать echo только для информационных сообщений и использовать printf для всего остального, так как это гораздо более мощный, гибкий и надежный инструмент. Последовательность ведомостей

printf '-' 
printf '-' 
printf '-' 
printf '-' 
printf '-' 

фактически производит выход -----.

+0

Да, но нет причин, по которым нужно вести себя иначе, чем 'echo -n" - "'. –

+0

Форма 'echo -n' не переносима, и использование команды echo не рекомендуется: http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html –

+0

Да, но OP использует bash (предполагается, что пространство перед '#!' не существует в реальном скрипте), а 'echo -n' работает в bash. Даже если '#!' Неверно, как я упоминал в своем ответе, маловероятно, что OP использует реализацию, где '-n' не работает. Если бы он был, он напечатал бы буквальный '-n', который OP не сообщает. Вы поднимаете действительную точку об использовании 'printf', а не' echo', но вряд ли это ответ на вопрос OP. –

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