Bash: preserve string with spaces input on command line?

18,779

The main thing to worry about is that when you refer to a variable without enclosing it in double-quotes, the shell does word splitting (splits it into multiple words wherever there's a space or other whitespace character), as well as wildcard expansion. Solution: use double-quotes whenever you refer to a variable (e.g. echo "$input").

Second, read will trim leading and trailing whitespace (i.e. spaces at the beginning and/or end of the input). If you care about this, use IFS= read (this essentially wipes out its definition of whitespace, so nothing gets trimmed). You might also want to use read's -r ("raw") option, so it doesn't try to interpret backslash at the end of a line as a continuation character.

Finally, I'd recommend using read's -p option to supply the prompt (instead of echo -n).

With all of these changes, here's what your script looks like:

IFS= read -r -p "Enter description: " input
echo "$input"
Share:
18,779
asking
Author by

asking

Updated on June 14, 2022

Comments

  • asking
    asking almost 2 years

    I'd like to allow a string to be captured with spaces, so that:

    echo -n "Enter description: "
    read input
    echo $input
    

    Would produce:

    > Enter description: My wonderful description!
    > My wonderful description!
    

    Possible?

  • Aleks-Daniel Jakimenko-A.
    Aleks-Daniel Jakimenko-A. almost 10 years
    Sometimes it is much better to point someone to FAQ instead of reinventing the wheel. mywiki.wooledge.org/BashPitfalls#read_.24foo and mywiki.wooledge.org/BashPitfalls#echo_.24foo