Bash %s спецификатор формата исключает пробелы в строке при распечатке

Я начинаю использовать printf вместо echo, Мой первый прорыв в printf %s это:

#!/bin/bash
danny=$(tail -1 /come/and/play/with/US.log| ~/walt/convert_gm_est)
printf "%s" $danny
08:02.020ZINFO<-casper/casperbox001wowSYSSTATS[sz=21,tag=0,aux=0]process_log2221397800

Это устраняет все пробелы в строке. Поэтому я добавил пробел после спецификатора формата. Строка выглядит лучше с пробелами, плюс я могу очень легко вырвать время с помощью awk. Я не вижу ничего об этом в Интернете. Я попробовал "%s\s" и это не сработало. Это стандартная процедура для использования спецификаторов формата - используйте пробел после %s? Это способ сделать это или я что-то упустил?

#!/bin/bash
danny=$(tail -1 /come/and/play/with/US.log| ~/walt/convert_gm_est)
printf "%s " $danny
08:02.020Z INFO <- casper/casperbox001wow SYSSTATS[sz=21, tag=0, aux=0] process_log 2221397 80 0 casper@casperbox001wow:~$

1 ответ

Решение

Когда оболочка оценивает:

printf "%s" $danny

оболочка расширит значение переменной danny а затем разделить его на слова. Это также расширит глобусы в этих словах. Как только это будет сделано, выражение будет выглядеть примерно так (цитаты добавлены для пояснения):

printf '%s' '08:02.020Z' 'INFO' '<-' 'casper/casperbox001' 'wow0' 'SYSSTATS'...

printf повторяет свою строку формата, пока все аргументы не будут использованы. Таким образом, используя строку формата %s вызывает объединение аргументов без использования пробелов.

Вы, вероятно, хотели процитировать $danny так что это будет представлено как один аргумент для printf:

printf "%s" "$danny"
Другие вопросы по тегам