我正在使用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 -name。我在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
谢谢你的帮助。问候。
我没有普通的旧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
使用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。