2014-09-29 29 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