问题
I have a variable of sources that is basically a string of comma-separated elements:
SOURCES="a b c d e"
I want the user to input one destination for each of this source, and I want hence to store this input into a string looking like the above but containing the destinations. If I want to assign a=1, b=2... etc, I would have something like this:
echo $DESTINATIONS >>> "1 2 3 4 5"
In order to do the above, I do this:
SOURCES="a b c d e"
DESTINATIONS=""
for src in $SOURCES
do
echo Input destination to associate to the source $src:
read dest
DESTINATIONS=$DESTINATIONS $dest
done
However, if I do an echo
on $DESTINATIONS
, I find it empty.
Moreover, at each loop, my shell tells me:
-bash: = **myInput**: command not found
Any idea where I'm doing wrong?
回答1:
SOURCES="a b c d e"
DESTINATIONS=""
for src in $SOURCES
do
echo Input destination to associate to the source $src:
read dest
DESTINATIONS+=" ${dest}"
done
echo $DESTINATIONS
works for me.
回答2:
You should be using an array, not a delimited string.
sources=(a b c d e)
for src in "${sources[@]}"
do
read -p "Input destination to associate to the source $src" dest
destinations+=( "$dest" )
done
printf '%s\n' "${destinations[@]}"
回答3:
The most obvious issue with your code is this line:
DESTINATIONS=$DESTINATIONS $dest
Rather, the above line should be written:
DESTINATIONS="$DESTINATIONS $dest"
The issue: You are executing $dest and passing an environment of DESTINATIONS=$DESTINATIONS. This hopefully explains the error messages you are seeing.
I tried your code out with the quotes I've suggested and it works fine.
回答4:
Q: What is wrong?
A: Not using quotes where needed.
If you use an space un-quoted it will be used by the shell to split the line.
When you use:
DESTINATIONS=$DESTINATIONS $dest
The variable $dest is understood by the shell as a command to execute, that's why you are getting the error:
-bash: = **myInput**: command not found
To solve the issue, just quote the space.
There are several ways to do that:
DESTINATIONS=$DESTINATIONS" "$dest
DESTINATIONS=$DESTINATIONS' '$dest
DESTINATIONS="$DESTINATIONS"' '"$dest"
DESTINATIONS="$DESTINATIONS $dest"
The last option is probably the simplest and also the best overall.
You could use also this syntax (since bash 3.1-alpha1):
DESTINATIONS+=" $dest"
Also, please!, quote your other expansions:
echo "$DESTINATIONS"
来源:https://stackoverflow.com/questions/42934198/concatenate-inputs-in-string-while-in-loop