Bourne shell构建字符串并使用它作为参数



我正在使用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。

相关内容

最新更新