Почему такой код
buf="a b"
printf "%s\n" $buf
выводит две строки ("a\n", "b\n"), а такой
printf "%s\n" "a b"
одну ("a b\n")?
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 '@'
Здравствуйте, 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+>