Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在BASH中更新另一个变量中的变量?_Bash - Fatal编程技术网

如何在BASH中更新另一个变量中的变量?

如何在BASH中更新另一个变量中的变量?,bash,Bash,我有一个变量,$var_c,它包含很多复杂的语法。我不想重写很多次,因为这很容易出错。但有时数据会发生变化 #!/bin/bash var_a="cat" var_b="dog" var_c="<div class=\"pet_a\">$var_a</div><div class=\"pet_b\">$var_b</div>" echo $var_c var_a="fish" var_b="whale" echo $var_c 但是,在

我有一个变量,$var_c,它包含很多复杂的语法。我不想重写很多次,因为这很容易出错。但有时数据会发生变化

#!/bin/bash

var_a="cat"
var_b="dog"

var_c="<div class=\"pet_a\">$var_a</div><div class=\"pet_b\">$var_b</div>"

echo $var_c

var_a="fish"
var_b="whale"

echo $var_c
但是,在更改变量$var_a和$var_b之后,$var_c不会更新

如何告诉BASH更新此变量,而不必再次完全提供所有语法?

请改用Shell函数 在Bash中,赋值中的插值发生在赋值时。所以,你不能真正做你想用变量做的事情。相反,您应该使用shell函数。例如:

var_a="cat"
var_b="dog"
var_c () {
    echo "<div class=\"pet_a\">$var_a</div><div class=\"pet_b\">$var_b</div>"
}
echo $(var_c)
# <div class="pet_a">cat</div><div class="pet_b">dog</div>

var_a="fish"
var_b="whale"
echo $(var_c)
# <div class="pet_a">fish</div><div class="pet_b">whale</div>
fmt="<div class=\"pet_a\">%s</div><div class=\"pet_b\">%s</div>"
var_a="cat"
var_b="dog"
printf -v var_c "$fmt" "$var_a" "$var_b"
echo "$var_c"
# <div class="pet_a">cat</div><div class="pet_b">dog</div>

var_a="fish"
var_b="whale"
printf -v var_c "$fmt" "$var_a" "$var_b"
echo "$var_c"
# <div class="pet_a">fish</div><div class="pet_b">whale</div>

注意,在这种情况下,您可以直接调用var_c,而不是echo$var_c,因为函数已经包含echo语句。我特意在示例中使用它来维护您当前的语义,并展示如何像变量一样使用shell函数。

变量包含数据,而不是逻辑。当您设置变量时,您是将其设置为特定值,而不是计算该值的规则。如果您想要在不同的时间返回不同的结果,您需要更像函数的东西:

func_c() {
    echo "<div class=\"pet_a\">$var_a</div><div class=\"pet_b\">$var_b</div>"
}

var_a="cat"
var_b="dog"
echo "$(func_c)"  # echoes '<div class="pet_a">cat</div><div class="pet_b">dog</div>'

var_a="fish"
var_b="whale"
echo "$(func_c)"  # echoes '<div class="pet_a">fish</div><div class="pet_b">whale</div>'
在上面的例子中,我使用了更多的双引号,但在不需要时使用它们比在需要时不使用它们要好。

使用Printf格式字符串 在Bash中,赋值中的插值发生在赋值时。所以,你不能真正做你想用变量做的事情。解决这个问题的一种方法是使用格式字符串和printf内置。内置支持a-v标志,该标志表示:

  -v var    assign the output to shell variable VAR rather than
            display it on the standard output
例如:

var_a="cat"
var_b="dog"
var_c () {
    echo "<div class=\"pet_a\">$var_a</div><div class=\"pet_b\">$var_b</div>"
}
echo $(var_c)
# <div class="pet_a">cat</div><div class="pet_b">dog</div>

var_a="fish"
var_b="whale"
echo $(var_c)
# <div class="pet_a">fish</div><div class="pet_b">whale</div>
fmt="<div class=\"pet_a\">%s</div><div class=\"pet_b\">%s</div>"
var_a="cat"
var_b="dog"
printf -v var_c "$fmt" "$var_a" "$var_b"
echo "$var_c"
# <div class="pet_a">cat</div><div class="pet_b">dog</div>

var_a="fish"
var_b="whale"
printf -v var_c "$fmt" "$var_a" "$var_b"
echo "$var_c"
# <div class="pet_a">fish</div><div class="pet_b">whale</div>