Работа с printf
в сценарии удара, не добавляя пробелов после "\n"
не создает новую строку, тогда как добавление пространства создает новую строку, например:
Никакое пространство после "\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. не работает.
Отредактированный: При использовании эха вместо printf я получаю ожидаемый результат, но почему printf работает по-другому?
NewLine=`echo "\n"`
echo -e "Firstline${NewLine}Lastline"
Результат:
Firstline
Lastline
Оператор обратного апострофа удаляет завершающие новые строки. См. 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 определяет это поведение здесь :
[...] со стандартным выводом команды, удаляя последовательности из одного или нескольких символов в конце подстановки
Работает нормально, если вы добавите "\ r"
$ nl=`printf "\n\r"` && echo "1${nl}2" 1 2
Нам не нужны «echo» или «printf» для создания переменной NewLine:
NewLine="
"
printf "%q\n" "${NewLine}"
echo "Firstline${NewLine}Lastline"
Ваша отредактированная версия 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
Похоже, 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