我正在尝试在 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
, $b
is 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
尽管这需要保留一些字符用作分隔符,并安排将分隔符放在正确的位置等......