7

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?

codeforester
  • 39,467
  • 16
  • 112
  • 140
asking
  • 1,435
  • 3
  • 13
  • 21

1 Answers1

20

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"
Gordon Davisson
  • 118,432
  • 16
  • 123
  • 151
  • 2
    Sometimes it is much better to point someone to FAQ instead of reinventing the wheel. http://mywiki.wooledge.org/BashPitfalls#read_.24foo and http://mywiki.wooledge.org/BashPitfalls#echo_.24foo – Aleks-Daniel Jakimenko-A. Jun 21 '14 at 01:47