如何在 Bash 中构造变量名?

发布于 2024-11-17 18:37:10 字数 306 浏览 3 评论 0原文

我想构造变量名 N_fooN_bar 并在以下内容中使用它们的值:

#!/bin/bash
N_foo=2
N_bar=3
for i in { "foo" "bar" }
do
    for j in { 1..$(`N_$i`) }
    do
        echo $j
    done
done

我想使用 N_foo的值N_bar在两个内循环中,分别打印出1,2和1,2,3。正确的语法是什么?

I want to construct variable name N_foo and N_bar and use their values in the following:

#!/bin/bash
N_foo=2
N_bar=3
for i in { "foo" "bar" }
do
    for j in { 1..$(`N_$i`) }
    do
        echo $j
    done
done

I want to use the values of N_foo and N_bar in the two inner loops and print out 1, 2 and 1, 2, 3, respectively. What's the correct syntax?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

氛圍 2024-11-24 18:37:10
#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
    key="N_${i}"
    eval count='
$key
    for j in `seq 1 $count`
    do
        echo $j
    done
done
#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
    key="N_${i}"
    eval count='
$key
    for j in `seq 1 $count`
    do
        echo $j
    done
done
雨落星ぅ辰 2024-11-24 18:37:10

您可以使用间接变量引用运算符:

示例

var="foo"
nfoo=1
ref=n${var}
echo $ref
echo ${!ref}

给出以下输出:

nfoo
1

You can use the indirect variable reference operator:

Example

var="foo"
nfoo=1
ref=n${var}
echo $ref
echo ${!ref}

Which gives this output:

nfoo
1
路还长,别太狂 2024-11-24 18:37:10
#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
    i2="N_$i"
    seq 1 ${!i2}
done
#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
    i2="N_$i"
    seq 1 ${!i2}
done
瞳孔里扚悲伤 2024-11-24 18:37:10

我最终使用了以下代码。它使用参数替换技术(参见 http://tldp.org/LDP/abs /html/parameter-substitution.html)。

#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
j_max=N_$i
for (( j=1;  j<=${!j_max}; j++ ))
    do
    echo $j
    done
done

! 是历史扩展参数(参见 http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters)。 !j_max 将被设置为 j_max 的最新值替换,即第一/第二中的 N_foo/N_bar迭代。然后它调用 ${N_foo}/${N_bar} ,其在第 1/2 次迭代中的值为 2/3。

I ended up using the following code. It uses the parameter substitution technique (c.f. http://tldp.org/LDP/abs/html/parameter-substitution.html).

#!/bin/bash
N_foo=2
N_bar=3
for i in "foo" "bar"
do
j_max=N_$i
for (( j=1;  j<=${!j_max}; j++ ))
    do
    echo $j
    done
done

The ! is history expansion parameter (c.f. http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters). !j_max will be replaced by the most recent value set to j_max which is N_foo/N_bar in 1st/2nd iteration. It then calls ${N_foo}/${N_bar} which has value 2/3 in the 1st/2nd iteration.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文