2014-09-29 30 views
4

我可能只是有一个大脑屁,但我不能为我的生活弄清楚如何循环shell脚本中的数组,而不是bash。我确定答案是在某处已经在stackoverflow,但我找不到使用bash的方法。对于我的嵌入式目标系统bash目前不是一种选择。以下是我正在尝试执行的一个示例以及返回的错误。shell脚本中的数组,而不是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 

每当我运行这个脚本时,错误“Bad substitution”就会返回给if语句行。如果你们有任何想法,我将不胜感激。谢谢!

+0

哪个发行版?或者,你的嵌入式系统中的shell是/ bin/sh? – 2014-09-29 02:33:13

+0

我会马上查看一下,但它应该和debian中使用的shell一样。 – TheLastFuzzy 2014-09-29 02:36:22

+1

'if'行有不平衡的括号和'-'和'eq'之间的空格,所以我会先解决这些问题。 – 2014-09-29 02:40:37

回答

4

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 
+0

我认为应该这样做!谢谢Elliott! – TheLastFuzzy 2014-09-29 03:07:34

1

最好不要使用eval除非有没有其他选择。 (bash漏洞的最新版本是由于shell在内部对环境变量的内容进行的,而没有首先验证它们的内容)。在这种情况下,您似乎完全控制了所涉及的变量,但是您可以在不使用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 
1

人们可以使用位置参数为...

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的:通过busybox的1.27.2灰

~ $ ./test.sh 
0 is disabled. 
1 is enabled. 
2
a="abc 123 def" 

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

输出:

abc 
123 
def 
+2

虽然此代码片段可能会解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – 2016-09-19 08:33:53