Почему Bourne shell printf выполняет итерацию по аргументу %s?
Вопрос
Что здесь происходит?
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
" (по этой и другим причинам).
Решение
Ваша переменная NAME заменяется следующим образом:
printf "Hello, %s\n" George W. Bush
Используй это:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
Другие советы
есть ли какая-то конкретная причина, по которой вы используете printf, или echo будет работать и у вас?
NAME="George W. Bush"
echo "Hello, "$NAME
приводит к
Hello, George W. Bush
Редактировать:Причина, по которой он повторяется над "Джорджем У.Bush" - это потому, что оболочка bourne ограничена пробелом.Чтобы продолжать использовать printf, вы должны заключить $NAME в двойные кавычки
printf "Hello, %s\n" "$NAME"
То, как я интерпретирую справочная страница считает ли он строку, которую вы ему передаете, аргументом;если в вашей строке есть пробелы, он думает, что вы передаете несколько аргументов.Я считаю, что ColinYounger прав, заключив переменную в кавычки, что заставляет оболочку интерпретировать строку как один аргумент.
Альтернативой может быть разрешение printf расширять переменную:
printf "Hello, $NAME."
Ссылки даны для bash, но я почти уверен, что то же самое справедливо и для sh.
Если вы хотите, чтобы все эти слова были напечатаны сами по себе, используйте Печать вместо того, чтобы printf
printf принимает спецификацию форматирования и применяет ее к каждому аргументу, который вы передаете.Поскольку у вас есть три аргумента {George, W., Bush}, он выводит строку три раза, используя разные аргументы.