用变量名定义变量


11

这个脚本怎么了?我正在尝试定义A1 = 1,B1 = 1,C1 = 1

LIST="A B C"
for x in $LIST
do
    "$x"1=1
done

结果是:

./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found

1
我认为您不能像这样在bash中创建变量。这就是数组的作用。
2015年

3
使用eval "$x"1=1。尽管如Jakuje所述,数组可能更适合这种情况。
Andrea Corbellini 2015年

@AndreaCorbellini您应该将其写为答案。
Sparhawk

Answers:


21

变量赋值的形式为变量名,后跟等号,后跟(可选)值。

这是有效的分配:

ABC=123

"$x"1=1不是有效的赋值,因为"$x"1不是变量名。可以将其评估为变量名,但事实并非如此。实际上,shell认为这是命令。

做您想要实现的目标的一种方法是:

eval "$x"1=1

bash中的另一种方式(但不是在其他shell中)是:

declare "$x"1=1

或者(再次仅限bash):

let "$x"1=1

(您的情况没有太大区别。)

但是,正如Jakuje评论中指出的那样,如果您的shell拥有数组(ksh,bash或zsh),则可能要使用数组。


为了完整性:

  • eval执行任意命令。因此,如果在等号的右侧,您有一个扩展为某个命令的变量,则该命令将被执行。如下代码:

    x=a
    y='$(echo hello)'
    eval "$x=$y"

    等同于a=hello

  • declare是bash内置函数,用于分配变量,不会执行任何命令。如下代码:

    x=a
    y='$(echo hello)'
    declare "$x=$y"

    等同于a='$(echo hello)'

  • let与相似declare,因为它不执行命令。但是与相反declarelet可以用于算术运算:

    let a="1 + 2"

    等同于a=3


偶数ABC = 123无效。因为在equal(=)符号之前和之后添加了空格。
Mahendran Sakkarai,

3

bash FAQ中有一个关于间接的条目。在大多数用例中,您实际应该使用的是关联数组或索引数组。您也可以使用

func_call_by_reference() { # Bash 4.3
    typeset -n ref=$1   # nameref to the variable named by the caller
    ref=( "val1" "val2" ... )  # return an array by reference
}

请参阅该FAQ条目,以获得更多选择,同时又避免混乱的eval报价。


0

您可以使用如下代码。在您的代码中,shell "$x"1=1作为命令执行,因为它不是有效的变量分配。

LIST="A B C"
for x in $LIST
do
    a=$(echo "$x"1)
    let $a=1
done

您正在使用什么外壳?使用bosh bash 4.1.7和4.3.11时,我收到有关command not found <varname>=1尝试执行此操作的错误(显然,<varname>是我存储的值a
Eric Renouf

由@Andrea Corbellini解释,我们必须使用让,声明或EVAL来分配值..
AVJ

1
你不需要echo这里!只是a="$x"1。也是let算术上下文,因此您只能为其分配数字。
彼得·科德斯

declare $a=foobar作品。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.