Что тут происходит?
printf.sh:
#! /bin/sh
NAME = "George W. Bush"
printf "Hello, %s\n" $NAME
Сеанс командной строки:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
ОБНОВЛЕНИЕ: printf "Hello, %s\n" "$NAME" работает. Почему я не использую echo, рассмотрим
echo.sh:
#! /bin/sh
FILE = "C:\tmp"
echo "Filename: $FILE"
Командная строка:
$ ./echo.sh
Filename: C: mp
Спецификация POSIX для echo говорит: «Новым приложениям рекомендуется использовать printf вместо echo» (по этой и другим причинам).
На самом деле, использование% s, вероятно, является хорошей привычкой из соображений безопасности и корректности. printf выполнит \ замену и другие вещи в строке формата, поэтому по возможности не используйте переменные.





Если вы хотите, чтобы все эти слова были напечатаны сами по себе, используйте Распечатать вместо printf
printf принимает спецификацию форматирования и применяет ее к каждому аргументу, который вы передаете. Поскольку у вас есть три аргумента {Джордж, У., Буш}, он выводит строку три раза, используя разные аргументы.
print (1) предназначен для печати файла на принтере после проверки его mime-типа. Это не оболочка, встроенная в bash.
есть ли конкретная причина, по которой вы используете printf, или echo тоже подойдет вам?
NAME = "George W. Bush"
echo "Hello, "$NAME
приводит к
Hello, George W. Bush
редактировать: Причина, по которой он перебирает "Джорджа Буша", заключается в том, что оболочка Борна ограничена пространством. Чтобы продолжить использование printf, вы должны заключить $ NAME в двойные кавычки.
printf "Hello, %s\n" "$NAME"
Ваша переменная NAME заменяется следующим образом:
printf "Hello, %s\n" George W. Bush
Использовать это:
#! /bin/sh
NAME = "George W. Bush"
printf "Hello, %s\n" "$NAME"
Я интерпретирую страница руководства так, что он считает строку, которую вы ему передаете, аргументом; если в вашей строке есть пробелы, он думает, что вы передаете несколько аргументов. Я считаю, что ColinYounger прав, заключив переменную в кавычки, что заставляет оболочку интерпретировать строку как единственный аргумент.
Альтернативой может быть разрешение printf расширять переменную:
printf "Hello, $NAME."
Ссылки предназначены для bash, но я почти уверен, что то же самое относится и к sh.
Нет, "думает" нет. Он ДЕЙСТВИТЕЛЬНО передавал несколько аргументов, потому что он не процитировал расширение $ NAME в команде printf. Оболочка расширила его, затем разбила по словам, а затем передала 3 аргумента printf. Но, как вы говорите, Колин Янгер прав.
Встроенное эхо bash не выполняет \ замену по умолчанию, но эхо оболочки POSIX (например, тире) выполняет, как указывает ваша ссылка на спецификацию. Поскольку вы все равно используете оболочку, вы можете просто напечатать "Hello, $ NAME \ n"