printf in shell show only the first word

2020-04-23 06:47发布

问题:

I am making a program shell (#!/bin/sh) and the problem is that printf show just the first word of the string param.

This is an extract of code to simplify for you:

#!/bin/sh

test="Good morning"
printf "\n"
printf $test
printf "\n"

This code outputs just Good.

回答1:

Double-quote your variable to avoid getting Word-splitting by shell

printf "$test"

Moreover, the general syntax for printf like C would be to have

printf <FORMAT> <ARGUMENTS...>

The text format is given in <FORMAT>, while all arguments the format string may point to are given after that, here, indicated by <ARGUMENTS…>.

The problem you are seeing is because an unquoted variable in bash invokes the word-splitting. This means that the variable is split on whitespace (or whatever the special variable $IFS has been set to) and each resulting word is used as a glob (it will expand to match any matching file names). Your problem is with because of the splitting part.



回答2:

Correct. Only the first argument is the format string, the others are additional arguments to be formatted. Just like in C.

printf '\n'
printf '%s' "$test"
printf '\n'