Подтвердить что ты не робот

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

Работа с printf в bash script, добавление пробелов после "\n" не создает новую строку, тогда как добавление пробела создает новую строку, e. g.:

  • Без пробела "\n"

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

    Результат:

    FirstlineLastline
    
  • Пробел после "\n "

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

    Результат:

    Firstline
     Lastline
    

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

Firstline 
Lastline

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

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

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

Результат:

    Firstline
    Lastline
4b9b3361

Ответ 1

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

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

Для сравнения:

[[email protected] ~]$ printf "\n"

[[email protected] ~]$ echo "\n"
\n
[[email protected] ~]$ echo -e "\n"


[[email protected] ~]$

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

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

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

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

Ответ 2

Похоже, что 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

Ваша отредактированная версия 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

Ответ 4

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

Firstline
Lastline

$ echo "Firstline${NewLine}Lastline"
Firstline
Lastline

Ответ 5

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

NewLine="
"
printf "%q\n" "${NewLine}"
echo "Firstline${NewLine}Lastline"

Ответ 6

Возможно, люди придут сюда с той же проблемой, что и я: echoing\n внутри кода, завернутого в backsticks. Маленький совет:

printf "astring\n"
# and 
printf "%s\n" "astring" 
# both have the same effect.
# So... I prefer the less typing one

Короткий ответ:

# Escape \n correctly !

# Using just: printf "$myvar\n" causes this effect inside the backsticks:
printf "banana
"

# So... you must try \\n  that will give you the desired 
printf "banana\n"

# Or even \\\\n if this string is being send to another place 
# before echoing,

buffer="${buffer}\\\\n printf \"$othervar\\\\n\""

Одна из распространенных проблем заключается в том, что если вы делаете внутри кода:

echo 'Tomato is nice'

когда окруженные обратными окнами будут вызывать ошибку

command Tomato not found.

Обходной путь - добавить еще один echo -e или printf

printed=0

function mecho(){
  #First time you need an "echo" in order bash relaxes.
  if [[ $printed == 0 ]]; then
    printf "echo -e $1\\\\n"
    printed=1
  else
    echo -e "\r\n\r$1\\\\n"
  fi
}

Теперь вы можете отлаживать свой код в подсказке просто:

(prompt)$  `mySuperFunction "arg1" "etc"`

Результат будет приятным.

 mydebug: a value
 otherdebug: whathever appended using myecho
 a third string

и внутренняя отладка

mecho "a string to be hacktyped"

Ответ 7

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

$ nl=`printf "\n\r"` && echo "1${nl}2"
1
2