我正在使用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
感谢您的帮助。问候。
答案 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 \