【问题标题】:Arrays in Shell Script, not BashShell 脚本中的数组,而不是 Bash
【发布时间】:2014-09-29 02:32:09
【问题描述】:

我可能只是在放屁,但我终其一生都无法弄清楚如何在 shell 脚本中循环遍历数组,而不是 bash。我确定答案已经在某个地方的 stackoverflow 上,但我找不到不使用 bash 的方法。对于我的嵌入式目标系统,bash 目前不是一个选项。这是我正在尝试执行的操作以及返回的错误的示例。

#!/bin/sh

enable0=1
enable1=1

port=0
while [ ${port} -lt 2 ]; do
    if [ ${enable${port}} -eq 1 ]
        then
        # do some stuff
    fi

    port=$((port + 1))
done

每当我运行此脚本时,都会返回错误“错误替换”以用于 if 语句。如果你们有任何想法,我将不胜感激。谢谢!

【问题讨论】:

  • 哪个发行版?或者,在您的嵌入式系统中,/bin/sh 是哪个 shell?
  • 我稍后会确定,但它应该与 debian 中使用的 shell 相同。
  • if 行的括号不平衡,-eq 之间有一个空格,所以我会先解决这些问题。
  • 其实我错了。系统指向busybox,然后它转身指向灰烬的变化。对于那个很抱歉。这个平台还是新手
  • 哎呀,好抓雷!那是仅在 stackoverflow 上的错误类型,而不是在我的实际脚本中。

标签: linux shell embedded sh


【解决方案1】:
a="abc 123 def"

set -- $a
while [ -n "$1" ]; do
    echo $1
    shift
done

通过busybox 1.27.2 ash输出:

abc
123
def

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案2】:

BusyBox 提供ash 不直接提供数组支持。你可以使用eval 之类的,

#!/bin/busybox sh
enable0=0
enable1=1

for index in 0 1 ; do
  eval assign="\$enable$index"
  if [ $assign == 1 ]; then
    echo "enable$index is enabled"
  else
    echo "enable$index is disabled"
  fi
done

【讨论】:

    【解决方案3】:

    最好不要使用eval,除非有没有其他选择。 (最近大量的bash 漏洞利用是由于shell 在内部evaling 环境变量的内容而没有先验证它们的内容)。在这种情况下,您似乎可以完全控制所涉及的变量,但您可以在不使用 eval 的情况下迭代变量值。

    #!/bin/sh
    
    enable0=1
    enable1=1
    
    for port_enabled in "$enable0" "$enable1"; do
        if [ "$port_enabled" -eq 1 ]; then
            # do some stuff
        fi
    done
    

    【讨论】:

      【解决方案4】:

      可以为此使用位置参数...

      http://pubs.opengroup.org/onlinepubs/009696799/utilities/set.html

      #!/bin/sh
      
      enable0=0
      enable1=1
      
      set -- $enable0 $enable1
      
      for index in 0 1; do
          [ "$1" -eq 1 ] && echo "$1 is enabled." || echo "$1 is disabled."
          shift
      done
      

      在busybox上运行:

      ~ $ ./test.sh 
      0 is disabled.
      1 is enabled.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 2013-02-10
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2019-09-12
        相关资源
        最近更新 更多