Bourne shell构建字符串并将其用作参数

时间:2014-08-15 12:15:37

标签: linux shell build var

我正在使用bourne shell并希望执行以下操作:

COUNTER=0
CIRCLEPART1="|"
CIRCLEPART2="/"
CIRCLEPART3="--"
CIRCLEPART4='\'

while [ $COUNTER -lt 3 ]; do
    ACT_CIRCLEPART=CIRCLEPART$COUNTER
    echo "Hello `eval \${ACT_CIRCLEPART}`"
    COUNTER=`expr $COUNTER + 1`
done

我想在每个循环中添加一个CIRCLE名称。我在stackoverflow上找到了一个代码片段,但它也不起作用,因为我的输出是“Hello,8537 {myConstructedVar}。”:

FOOCOUNT=4
FOO_0=John
FOO_1=Barry
FOO_2=Lenny
FOO_3=Samuel
count=$FOOCOUNT
counter=0
while [ $counter -lt $count ]
do
    myConstructedVar=FOO_$counter
    counter=`expr $counter + 1`
    echo "Greeting #$counter: Hello, `eval echo \$${myConstructedVar}`."
done

感谢您的帮助。问候。

2 个答案:

答案 0 :(得分:1)

改为使用BASH和数组:

BUSY=("|" "/" "-" "\\\\")
while [[ $COUNTER -lt 4 ]]; do
    printf "Hello ${BUSY[$COUNTER]}\r"
    sleep 0.3
    ((COUNTER ++))
done
echo

奇数\\\\是必要的,因为在解析该行时,BASH会将其减少为\\,因为它们用于双引号。然后printf将再次解析参数,将其减少为单个\

注意:Bourne shell非常非常古老。我怀疑你今天能找到任何至少没有KSH的Unix系统。此外,在大多数Linux系统上,/bin/sh也不是纯粹的Bourne shell。

答案 1 :(得分:1)

我没有普通的sh来测试它(我已尝试bash --posix),但这可能会起作用:

COUNTER=0
CIRCLEPART1="|"
CIRCLEPART2="/"
CIRCLEPART3="--"
CIRCLEPART4='\'
while [ $COUNTER -lt 3 ]; do
    ACT_CIRCLEPART=CIRCLEPART$COUNTER
    eval echo "Hello \$$ACT_CIRCLEPART"
    COUNTER=`expr $COUNTER + 1`
done

输出是:

Hello 
Hello |
Hello /

这也适用于bash

第一行输出引用未定义的CIRCLEPART0。更正并运行所有已定义的变量:

COUNTER=1
CIRCLEPART1="|"
CIRCLEPART2="/"
CIRCLEPART3="--"
CIRCLEPART4='\'
while [ $COUNTER -lt 5 ]; do
    ACT_CIRCLEPART=CIRCLEPART$COUNTER
    eval echo "Hello \$$ACT_CIRCLEPART"
    COUNTER=`expr $COUNTER + 1`
done

输出是:

Hello |
Hello /
Hello --
Hello \