Пример Printf в bash не создает новую строку
Работа с printf
в bash script, добавление пробелов после "\n"
не создает новую строку, тогда как добавление пробела создает новую строку, e. g.:
Вопрос: Почему нет 1. создайте следующий результат:
Firstline
Lastline
Я знаю, что эту конкретную проблему можно было бы использовать с использованием других методов, но я хочу сосредоточиться на том, почему 1. не работает.
Отредактировано:
При использовании echo вместо printf я получаю ожидаемый результат, но почему printf работает по-другому?
NewLine=`echo "\n"`
echo -e "Firstline${NewLine}Lastline"
Результат:
Firstline
Lastline
Ответы
Ответ 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