Почему Bourne shell printf выполняет итерацию по аргументу %s?

StackOverflow https://stackoverflow.com/questions/42070

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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}, он выводит строку три раза, используя разные аргументы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top