如何动态获取变量名称

时间:2015-10-24 21:10:08

标签: arrays bash loops

#!/bin/bash
year="${1:0:4}";month="${1:4:2}";day="${1:6:2}"

element=('Wood' 'Fire' 'Earth' 'Metal' 'Water')

rat=(05021924 23021925 24011936 10021937 10021948 28011949 28011960 14021961 15021972 02021973 02021984 19021985 19021996 06021997 07022008 25012009 25012020 11022021 11022032 30012033)

pig=(04021935 23011936 22011947 09021948 08021959 27011960 27011971 14021972 13021983 01021984 31011995 18021996 18022007 06022008 05022019 24012020 23012031 10022032 10022043 29012044)

Scounter=0
Ecounter=1

for (( i=0; i<10; i++ )) #10 is the number of date RANGES
do
        echo $i
#done

#echo "start of year"
#Make sure that the base value for Month and Day is base 10 and not base 8. Base 8 is a number starting with 0.
    sDay=${rat[$Scounter]:0:2};sMonth=${rat[$Scounter]:2:2};sYear=${rat[$Scounter]:4:4}
#echo "end of year"
    eDay=${rat[$Ecounter]:0:2};eMonth=${rat[$Ecounter]:2:2};eYear=${rat[$Ecounter]:4:4}

#10base conversion
#month=$((10#$month))
#day=$((10#$day))
#sMonth=$((10#$sMonth))
#sDay=$((10#$sDay))
#eMonth=$((10#$eMonth))
#eDay=$((10#$eDay))

    if [[ $year -eq $sYear && $month -ge $sMonth && $day -ge $sDay ||  $year -eq $eYear && $month -le $eMonth && $day -le $eDay ]]
    then
        if [[ $i -gt 4 ]]
        then
            echo "${element[$((i-5))]} rat"
        else
            echo "${element[$i]} rat"
        fi
        fi

    Scounter=$((Scounter+2))
    Ecounter=$((Ecounter+2))
done

我正在尝试更换&#34;老鼠&#34;在sDay,sMonth,sYear等。用一个指向数组大鼠或猪的变量。我尝试过使用替换

sDay=${$rat[$Scounter]:0:2};

但是我得到了替换错误

顺便说一下,我正在制作一个中国十二生肖剧本。

1 个答案:

答案 0 :(得分:4)

我相信你正在寻找间接:

$ rat=(05021924 23021925 24011936 10021937 10021948 28011949 28011960 14021961 15021972 02021973 02021984 19021985 19021996 06021997 07022008 25012009 25012020 11022021 11022032 30012033)
$ y="rat[1]"; echo "${!y}"
23021925
$ y="rat[1]"; echo "${!y:0:2}"
23

将上述内容用作循环的一部分:

for x in rat pig
do
    for i in 0 1
    do
        y="$x[$i]"
        echo "$x $i ${!y}"
    done
done

产生输出:

rat 0 05021924
rat 1 23021925
pig 0 04021935
pig 1 23011936

文档

来自man bash

  

$ {参数}
  参数的值被替换。当参数是具有多个数字的位置参数或参数时,需要括号   后跟一个不能被解释为其名称一部分的字符。该参数是如上所述的shell参数PARAMETERS)或     数组引用(数组)。

     

如果参数的第一个字符是感叹号(!),则为   引入了一个变量间接的级别。 Bash使用的值   由参数的其余部分形成的变量作为名称   变量;然后展开此变量,并在该变量中使用该值   其余的替换,而不是参数的值   本身。这被称为间接扩张。例外情况   是下面描述的$ {!prefix *}和$ {!name [@]}的扩展。   感叹号必须紧跟左支撑   介绍间接。 [重点补充。]