在Bash中将多个用户输入添加到一个变量中

4

我对Unix Bash脚本编写比较新,想知道这是否可行。我想要多次询问用户的输入值,然后将这些输入值存储到一个变量中。

userinputs=   #nothing at the start

read string
<code to add $string to $userinputs>
read string
<code to add $string to $userinputs> #this should add this input along with the other input

如果用户第一次输入"abc",则将其添加到$userinputs中。

然后再次要求输入时,如果用户输入"123",脚本应该将其存储在同一个$userinputs中。

这将使$userinput=abc123。

2个回答

5
通常在Bash中连接两个字符串的方法是:
new_string="$string1$string2"

只有当我们有一个可能阻碍变量扩展的字面字符串时,才需要在变量名称周围使用{}
new_string="${string1}literal$string2"

更应该;而不是
new_string="$string1literal$string2"

您也可以使用 += 运算符:
userinputs=
read string
userinputs+="$string"
read string
userinputs+="$string"

在这种情况下,对$string进行双引号括起来是可选的。


另请参阅:


我可以在while循环中使用这个来不断询问用户的输入,直到他们输入特定字符(如*),并且所有用户的输入都保存在一个变量中吗? - M.Azeem
是的,@M.Azeem,你可以这样做。 - codeforester

1
你可以将变量连接起来并将多个字符串存储在同一个变量中,方法如下:
foo=abc
echo $foo # prints 'abc'
bar=123
foo="${foo}${bar}"
echo $foo # prints 'abc123'

当给变量赋值时,你可以使用其他变量或相同的变量,例如 a="${a}123${b}"。有关更多信息,请参见this question

你不必引用要分配的字符串,也不必使用${var}语法,但学习何时引用和何时不引用是一门令人惊讶的微妙艺术,因此最好谨慎而不是抱歉,并且在双引号中使用"${var}"语法通常是最安全的方法(有关更多信息,请参见以下任何一个链接:1 2 3)。

无论如何,你应该将其读入临时变量(默认情况下,读入到$REPLY),然后将其连接到主变量上,就像这样:

allinput=
read # captures user input into $REPLY
allinput="${REPLY}"
read
allinput="${allinput}${REPLY}"

请注意,read 命令的行为会根据提供的开关和 IFS 全局变量的值而有很大不同,尤其是在面对带有特殊字符的不寻常输入时。常见的“按我的意思做”选择是通过 IFS= 清空 IFS 并使用 read -r 来捕获输入。有关更多信息,请参阅 read 内置文档


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