Пример Printf в ударе не создает новую строку

Работа с printf в сценарии удара, не добавляя пробелов после "\n" не создает новую строку, тогда как добавление пространства создает новую строку, например:

  1. Никакое пространство после "\n"

    NewLine=`printf "\n"`
    echo -e "Firstline${NewLine}Lastline"
    

    Результат:

    FirstlineLastline
    
  2. Пространство после "\n "

    NewLine=`printf "\n "`
    echo -e "Firstline${NewLine}Lastline"
    

    Результат:

    Firstline
     Lastline
    

Вопрос: Почему не делает 1. создайте следующий результат:

Firstline 
Lastline

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

Отредактированный: При использовании эха вместо printf я получаю ожидаемый результат, но почему printf работает по-другому?

    NewLine=`echo "\n"`
    echo -e "Firstline${NewLine}Lastline"

Результат:

    Firstline
    Lastline
24
задан WolfHumble 20 April 2010 в 16:24
поделиться

5 ответов

Оператор обратного апострофа удаляет завершающие новые строки. См. 3.4.5. Подстановка команд на http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

Примечание к отредактированному вопросу

Сравните:

[alvaro@localhost ~]$ printf "\n"

[alvaro@localhost ~]$ echo "\n"
\n
[alvaro@localhost ~]$ echo -e "\n"


[alvaro@localhost ~]$

Команда echo не работает ' t рассматривать \ n как новую строку, если вы не попросите его сделать это:

NAME
       echo - display a line of text
[...]
       -e     enable interpretation of backslash escapes

POSIX 7 определяет это поведение здесь :

[...] со стандартным выводом команды, удаляя последовательности из одного или нескольких символов в конце подстановки

28
ответ дан 28 November 2019 в 23:34
поделиться

Работает нормально, если вы добавите "\ r"

$ nl=`printf "\n\r"` && echo "1${nl}2"
1
2
-2
ответ дан 28 November 2019 в 23:34
поделиться

Нам не нужны «echo» или «printf» для создания переменной NewLine:

NewLine="
"
printf "%q\n" "${NewLine}"
echo "Firstline${NewLine}Lastline"
1
ответ дан 28 November 2019 в 23:34
поделиться

Ваша отредактированная версия echo помещает буквальную обратную косую черту-n в переменную $ NewLine , который затем интерпретируется вашим echo -e . Если бы вы сделали это вместо:

NewLine=$(echo -e "\n")
echo -e "Firstline${NewLine}Lastline"

, ваш результат был бы таким же, как и в случае №1. Чтобы , что работал таким образом, вам нужно было бы избежать обратной косой черты и заключить все в одинарные кавычки:

NewLine=$(printf '\\n')
echo -e "Firstline${NewLine}Lastline"

или двойное экранирование:

NewLine=$(printf "\\\n")

Конечно, вы могли бы просто использовать printf напрямую, или вы можете установить значение NewLine следующим образом:

printf "Firstline\nLastline\n"

или

NewLine=$'\n'
echo "Firstline${NewLine}Lastline"    # no need for -e
3
ответ дан 28 November 2019 в 23:34
поделиться

Похоже, BASH удаляет завершающие символы новой строки. например.

NewLine=`printf " \n\n\n"`
echo -e "Firstline${NewLine}Lastline"
Firstline Lastline

NewLine=`printf " \n\n\n "`
echo -e "Firstline${NewLine}Lastline"
Firstline


 Lastline
3
ответ дан 28 November 2019 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: