【问题标题】:Bourne shell build string and use it as paramBourne shell 构建字符串并将其用作参数
【发布时间】:2014-10-09 04:16:11
【问题描述】:

我正在使用 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 上找到了一个代码 sn-p,但它也不起作用,因为我的输出是“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

感谢您的帮助。问候。

【问题讨论】:

  • 您实际上是在使用 Bourne shell,还是只是在您的机器上使用 /bin/sh(这实际上可能是到另一个 shell 的链接,例如在 POSIX 兼容模式下运行的 dashbash)?

标签: linux shell build var


【解决方案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 \

【讨论】:

  • 带有eval的行可以简化为eval echo "Hello \$$ACT_CIRCLEPART"
  • 所以它可以,谢谢@chepner。我已经更新了答案以反映这种简化。
【解决方案2】:

改用 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。

【讨论】:

  • 如果他真的在使用 Bourne shell(或者可能只是 POSIX shell),则不能选择数组。
  • 感谢大家的帮助...几乎所有建议都奏效了!我实际上使用bash。由于使用了命令“sh someprogram.sh”,我在想我正在使用 bourne shell。
猜你喜欢
  • 2012-04-16
  • 2015-12-21
  • 1970-01-01
  • 2010-09-16
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多