function runstatus {
    echo "SVN Status -uq:"
    echo 
    status=$(svn status -uq)
    echo $status
    echo $bigline
}

Это печатает что-то вроде:

SVN Status -uq:

rd_backup rd_backup.sh update 764 update Состояние по пересмотру: 771

В то время как обычно, вручную запуская команду вместо ./update , это выглядит так:

svn status -uq

M * 764 обновление

Статус против пересмотра: 771

то есть с переводом строки. Как я могу убедиться, что форматирование остается неизменным и читаемым при запуске из скрипта?

1 ответ1

4

Если вы хотите , чтобы функция просто показать вывод команды, нет никакой необходимости , чтобы захватить выход , а затем echo его снова.

Просто запустите svn status -uq напрямую. Stdout также будет выводиться из вызова функции.


Если вам действительно нужно использовать переменные и echo их, вам нужно заключить в кавычки аргумент, передаваемый echo если вы хотите сохранить пробелы: echo "$status" .

Причина в том, что $status будет буквально содержать следующее:

M * 764 update
Status against revision: 771

Когда вы запускаете echo $status , echo будет вызываться так:

echo M * 764 update \
Status against revision: 771

Это более одного параметра, поскольку Bash разделяет аргументы на пробелах (см. $IFS). echo напечатает каждый аргумент, разделенный одним пробелом, поэтому, в то время как остальная часть строки выглядит нормально, новая строка, по сути, будет свернута в один пробел.

Если вы окружите аргумент кавычкой, echo увидит его только как один аргумент и правильно выведет его снова.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .