bash: разбивка аргументов printf по пробелу
От: Flammable Россия  
Дата: 26.08.13 07:15
Оценка:
Почему такой код

buf="a b"
printf "%s\n" $buf


выводит две строки ("a\n", "b\n"), а такой

printf "%s\n" "a b"


одну ("a b\n")?
Re: bash: разбивка аргументов printf по пробелу
От: dilmah США  
Дата: 26.08.13 07:48
Оценка:

If a parameter expansion occurs inside double-quotes:

Pathname expansion shall not be performed on the results of the expansion.

Field splitting shall not be performed on the results of the expansion, with the exception of '@'

Re: bash: разбивка аргументов printf по пробелу
От: Кодт Россия  
Дата: 29.08.13 14:57
Оценка: 2 (1)
Здравствуйте, Flammable, Вы писали:

Телепатируя, перефразирую твой вопрос:
"почему я передаю один аргумент, а он распадается на два?!"

Потому что баш подставляет его в командную строку, а там пробел. И, разбирая ком.строку, находит два аргумента.
Далее принтф нарезает аргументы группами по столько, сколько их упомянуто в строке формата (в твоём случае поштучно). И для каждой группы выполняет форматирование.

Чтобы такого не было, надо передавать аргумент в кавычках:
buf="a b c"

printf "<%s>"     $buf     # <a><b><c>
printf "<%s+%s>"  $buf     # <a+b><c+>

printf "<%s>"    "$buf"    # <a b c>
printf "<%s+%s>" "$buf"    # <a b c+>
Перекуём баги на фичи!
Re[2]: bash: разбивка аргументов printf по пробелу
От: Flammable Россия  
Дата: 29.08.13 17:41
Оценка:
Спасибо, все понятно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.