if语句中的变量替换

时间:2016-05-25 21:09:29

标签: unix ksh aix

我正在尝试执行以下

if [[ $1 == 'R' ]]
then
    echo "Running the recovery steps..."
    for i in 1 2 3 4 5 6
    do
        head -${i} cons.txt | tail -1 | read -r r${i}f1 r${i}f2 r${i}f3 r${i}f4 r${i}f5 r${i}f6 r${i}f7 r${i}f8 r${i}f9;
        if (( ${Time} >= ${r${i}f1} && ${Time} < ${r${i}f2} ))
        then
            sed "s/$r$if3}/`echo $r$if3 | cut -c1-4`/;s/$r$if4/`echo $r$if4 | cut -c1-4`/;s/$r$if5/`echo $r$if5 | cut -c1-4`/;s/$r$if6/`echo $r$if6 | cut -c1-4`/;s/$r$if7/`echo $r$if7 | cut -c1-4`/;s/$r$if8/`echo $r$if8 | cut -c1-4`/;s/$r$if9/`echo $r$if9 | cut -c1-4`/" cons.txt > cons.txt.tmp && mv cons.txt.tmp cons.txt
        fi
    done
fi

但内部if条件给我错误。我相信我在这里使用了错误的括号,但似乎无法找出正确的方法

trim.sh[6]: " ${Time} >= ${r${i}f1} && ${Time} < ${r${i}f2} ": 0403-011 The specified substitution is not valid for this command.

2 个答案:

答案 0 :(得分:0)

参数扩展在< ${r${i}f2}中不是递归的(或重复的,或由内而外的),因此这不起作用。

您可以使用eval使用一些复杂的代码在扩展之前构造变量名称,但这是一堆蠕虫。简单地展开六元素循环怎么样?

答案 1 :(得分:0)

您无法直接在变量引用中执行变量。

${r${i}f2}

您必须使用间接引用。试试下面的代码吧。使用eval我们可以做到这一点。

if [[ $1 == 'R' ]]
then
    echo "Running the recovery steps..."
    for i in 1 2 3 4 5 6
    do
        head -${i} cons.txt | tail -1 | read -r r${i}f1 r${i}f2 r${i}f3 r${i}f4 r${i}f5 r${i}f6 r${i}f7 r${i}f8 r${i}f9;
        eval var1=r${i}f1
        eval var2=r${i}f2

        eval val1=\$$var1
        eval val2=\$$var2

        if (( ${Time} >= $val1 && ${Time} < $val2 ))
        then
            sed "s/$r$if3}/`echo $r$if3 | cut -c1-4`/;s/$r$if4/`echo $r$if4 | cut -c1-4`/;s/$r$if5/`echo $r$if5 | cut -c1-4`/;s/$r$if6/`echo $r$if6 | cut -c1-4`/;s/$r$if7/`echo $r$if7 | cut -c1-4`/;s/$r$if8/`echo $r$if8 | cut -c1-4`/;s/$r$if9/`echo $r$if9 | cut -c1-4`/" cons.txt > cons.txt.tmp && mv cons.txt.tmp cons.txt
        fi
    done
fi