Почему printf оболочки Bourne перебирает аргумент% s? - PullRequest
7 голосов
/ 03 сентября 2008

Что здесь происходит?

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» (по этой и другим причинам).

Ответы [ 4 ]

7 голосов
/ 03 сентября 2008

Ваша переменная NAME заменяется следующим образом:

printf "Hello, %s\n" George W. Bush

Используйте это:

#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
1 голос
/ 03 сентября 2008

То, как я интерпретирую справочную страницу , заключается в том, что она считает строку, которую вы передаете, аргументом; если ваша строка имеет пробелы, она думает, что вы передаете несколько аргументов. Я считаю, что ColinYounger верен, заключая переменную в кавычки, что заставляет оболочку интерпретировать строку как один аргумент.

Альтернативой может быть позволить printf расширить переменную:

printf "Hello, $NAME."

Ссылки для bash, но я уверен, что то же самое относится и к sh.

1 голос
/ 03 сентября 2008

Есть ли конкретная причина, по которой вы используете printf, или эхо будет работать и для вас?

NAME="George W. Bush"
echo "Hello, "$NAME

результаты в

Hello, George W. Bush

редактирование: Причина, по которой он повторяется над «Джорджем Бушем», заключается в том, что оболочка Борна разделена пробелами. Чтобы продолжать использовать printf, вы должны поместить $ NAME в двойные кавычки

printf "Hello, %s\n" "$NAME"
0 голосов
/ 03 сентября 2008

Если вы хотите, чтобы все эти слова печатались самостоятельно, используйте print вместо printf

printf берет спецификацию форматирования и применяет ее к каждому передаваемому аргументу. Поскольку у вас есть три аргумента {Джордж, У., Буш}, он выводит строку три раза, используя разные аргументы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...