如何在bash中动态创建变量?

时间:2018-11-29 08:35:15

标签: linux bash unix sed

我有3个字符串:

p001="57 59 13 30 96 45 24 71 33 15 40"
p002="57 7 13 11 80 44 47 50 84 86 64"
p003="57 7 13 11 50 44 42 50 84 86 64"

基于mcount (001,002, or 003),我希望替换ptemp。但是我不知道如何“动态”创建一个新变量...

for mcount in {1..3}; do
    pad_m=`printf "%03d" $mcount`
    sed "s|PTEMP|p{pad_m}|; s|MTEMP|'${pad_m}'| " ./template.sh > .model.sh

这会导致错误。

我该怎么做?

template.sh

的摘录
```
mnum=MTEMP

for pvar in PTEMP; do #Cycles through parameter files
    pad_p=`printf "%03d" $pvar`

    for svar in sq1 sq99; do
        state_file=${mnum}/${svar}
        ./model.exe ${state_file}

done 
done
```

1 个答案:

答案 0 :(得分:1)

尽管我还没有完全理解您想做什么,但我的假设如下:

  • 遍历p001p002p003的元素,它们的数量由mcount索引,其范围为{1..3}。
  • 根据生成的循环变量执行./model.exe

然后您可以在下面说类似的内容,而无需生成.model.sh脚本。

#!/bin/bash

p001="57 59 13 30 96 45 24 71 33 15 40"
p002="57 7 13 11 80 44 47 50 84 86 64"
p003="57 7 13 11 50 44 42 50 84 86 64"

for mcount in {1..3}; do
    pad_m=$(printf "%03d" $mcount)
    mnum=$pad_m

    varname="p$pad_m"   # will hold "p001", "p002" or "p003"
    p=${!varname}       # indirect variable referencing
    for pvar in $p; do
        pad_p=$(printf "%03d" "$pvar")
        # echo "$pad_p" # for debugging
        for svar in sq1 sq99; do
            state_file="${mnum}/${svar}"
            ./model.exe "$state_file"
            # echo "$state_file" # for debugging
        done
    done
done

如果我的假设不正确,请告诉我。
BR。