首页 > 解决方案 > 在变量 bash 中使用变量

问题描述

嗨,我正在尝试更新名称中包含变量的变量,但无法弄清楚如何:

n=6
tot=5
        let abc6xyz="$abc6xyz"+"$tot"
        let abc6xyz="$abc6xyz"+"$tot"
        echo "abc6xyz $abc6xyz"
#  Works fine
        let abc${n}xyz="$abc${n}xyz"+"$tot"
        echo "abc6xyz $abc6xyz"


++ n=6
++ tot=5
++ let abc6xyz=+5
++ let abc6xyz=5+5
++ echo 'abc6xyz 10'
abc6xyz 10
++ let abc6xyz=6xyz+5
./calc_tots.tst: line 9: let: abc6xyz=6xyz: value too great for base (error token is "6xyz")`enter code here`
++ echo 'abc6xyz 10'
abc6xyz 10

提前谢谢你的帮助。

标签: bash

解决方案


你有几件事对你不利。首先,避免使用let,这是一个过时的 shell 特性。而是使用 POSIX 算术((...))

接下来,$abc${n}xyz扩展为$abc(未定义)并且${n}xyz"6xyz"或不是十进制八进制十六进制,因此它对于基数来说太大了。

在 bash 中使用 POSIX 算术,您可以更改脚本,合并((...))为:

#!/bin/bash

n=6
tot=5

    abc6xyz="$tot"
    ((abc6xyz+=tot))        ## use arithmetic operators ((..))
    echo "abc6xyz $abc6xyz"

    ((abc${n}xyz+=tot))           ## then use indirection, e.g. ${!foo}
    echo "abc6xyz $abc6xyz"

示例使用/输出

$ bash -x /tmp/tmp-david/bashindir.sh
+ n=6
+ tot=5
+ abc6xyz=5
+ (( abc6xyz+=tot ))
+ echo 'abc6xyz 10'
abc6xyz 10
+ (( abc6xyz+=tot ))
+ echo 'abc6xyz 15'
abc6xyz 15

添加间接或final=$((...))

在您解释的评论中,您希望将数字作为n=脚本的第一个参数(位置参数)包含在内。在这种情况下,要在所有添加后访问总值,请使用间接或分配$((...)).

例如,使用间接:

#!/bin/bash

((abc${1}xyz+=5))
((abc${1}xyz+=5))

foo="abc${1}xyz"

echo "abc${1}xyz: ${!foo}"

示例使用/输出

$ bash -x /tmp/tmp-david/redir.sh 6
+ (( abc6xyz+=5 ))
+ (( abc6xyz+=5 ))
+ foo=abc6xyz
+ echo 'abc6xyz: 10'
abc6xyz: 10

或者最好只分配最后一个算术运算的结果,例如

#!/bin/bash

((abc${1}xyz+=5))
final=$((abc${1}xyz+=5))

echo "abc${1}xyz: $final"

示例使用/输出

$ bash -x /tmp/tmp-david/assign.sh 6
+ (( abc6xyz+=5 ))
+ final=10
+ echo 'abc6xyz: 10'
abc6xyz: 10

推荐阅读