如何在 bash 中导出变量名称由两个变量组成的变量?

如何在 bash 中导出变量名称由两个变量组成的变量?

我正在尝试在 for 循环内导出变量,我希望循环的每次迭代都更改正在写入的变量。我一直在寻找正确的语法来满足 bash 中的导出,但我尝试过的都没有成功。执行此操作的正确方法是什么?

为了添加更多细节,我希望当循环运行时,我将在第一次运行时导出 FVAR0,在第二次运行时导出 FVAR1,在第三次运行时导出 FVAR2,依此类推。

本来我曾尝试过export FVAR$i

export "${!FVAR[$i]}"这是我最近的猜测。

#!/bin/bash
set -x
for i in 0 1 2 3 4
do
    export "${!FVAR[$i]}"=$(ls ./run/$i)
done


10:36:10 Thu Jan 24 ::  ./uploader.sh
+ for i in 0 1 2 3 4
++ ls ./run/0
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/1
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/2
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/3
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier
+ for i in 0 1 2 3 4
++ ls ./run/4
+ export =
./uploader.sh: line 5: export: `=': not a valid identifier

答案1

这有效:

#!/bin/bash

for x in 0 1 2 3; do
    export FVAR$x="Is's $x"
done

env | grep FVAR

执行:

$ ./fvar.sh 
FVAR3=Is's 3
FVAR2=Is's 2
FVAR1=Is's 1
FVAR0=Is's 0

答案2

export "${!FVAR[$i]}"=...

这将假设FVAR是一个数组,并尝试使用其索引中的元素$i作为变量的名称来在该命令行上扩展。 (也就是说,a=11; b=22; c=33; p=(a b c); echo ${!p[1]}会打印,22因为p[1]is b, $bis 22。)

FVAR[0]等不保存该脚本中的变量名称,因此扩展会导致空字符串。

你应该能够使用

for i in 1 2 3 4 5; do
    export "FVAR$i=$(generate some value from $i)"
done

asexport处理扩展后的变量名。然而,常规分配的情况并非如此。FVAR$i=$(...)不起作用。


当然,根据您正在做的事情,可能还有其他方法,例如将所有值放在一个变量中,然后将其导出。

FVARS="$(generate some value from 1)"
for i in 2 3 4 5 ; do
    FVARS+=":$(generate some value from $i)"
done
export FVARS

尽管这需要保留一些字符用作分隔符,并安排将分隔符放在正确的位置等......

相关内容