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?
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).
Bash uses whitespace to determine where words begin and end. The first word is the command name and additional words become arguments to that command.
bash [filename] runs the commands saved in a file. $@ refers to all of a shell script's command-line arguments. $1 , $2 , etc., refer to the first command-line argument, the second command-line argument, etc. Place variables in quotes if the values might have spaces in them.
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"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With