在循环中将输入连接成字符串

16

我有一个变量sources,它基本上是由逗号分隔的元素组成的字符串:

SOURCES="a b c d e"
我希望用户为每个源输入一个目的地,然后我想将此输入存储到一个字符串中,该字符串看起来类似于上面的内容,但包含目的地。如果我想将a = 1,b = 2 ..等分配,则会得到以下内容:
echo $DESTINATIONS >>> "1 2 3 4 5"
为了做到上述目的,我这样做:
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

然而,如果我在$DESTINATIONS上执行echo命令,我会发现它是空的。 此外,在每个循环中,我的Shell会告诉我:

-bash: = **myInput**: command not found

有什么想法我做错了吗?


你在 SOURCES 中没有用逗号分隔吗?只是用空格分隔的吗? - Inian
4个回答

23
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

对我来说有效。


非常感谢,"dutiona" :) - Matteo NNZ

6
你应该使用数组,而不是分隔符字符串。
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

问:有什么问题吗?
答:没有在需要时使用引号。

如果您未对空格进行引用,则 shell 将使用它来拆分行。

当您使用:

DESTINATIONS=$DESTINATIONS $dest

变量$dest被shell理解为要执行的命令,这就是为什么你会收到错误提示的原因:
-bash: = **myInput**: command not found

要解决问题,只需要引用空格。
有几种方法可以做到这一点:

DESTINATIONS=$DESTINATIONS" "$dest
DESTINATIONS=$DESTINATIONS' '$dest
DESTINATIONS="$DESTINATIONS"' '"$dest"
DESTINATIONS="$DESTINATIONS $dest"

最后一个选项可能是最简单的,也是总体上最好的选择。
你也可以使用这种语法(自bash 3.1-alpha1以来):
    DESTINATIONS+=" $dest"

此外,请引用您的其他扩展:
echo "$DESTINATIONS"

3
您的代码中最明显的问题是这一行:

DESTINATIONS=$DESTINATIONS $dest

相反,应该将上述行写成:

DESTINATIONS="$DESTINATIONS $dest"

问题:您正在执行$dest并传递一个环境变量DESTINATIONS=$DESTINATIONS。这可以解释您所看到的错误消息。
我已经尝试了您的代码,并使用我建议的引号,它可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接