2014-09-29 4 views
4

У меня, вероятно, есть мозговой пердит, но я не могу для жизни меня выяснить, как петля через массив в сценарии оболочки, а не bash. Я уверен, что ответ уже на stackoverflow уже есть, но я не могу найти способ сделать это без использования bash. Для моей встроенной целевой системы bash в настоящее время не является вариантом. Вот пример того, что я пытаюсь сделать, и возвращаемую ошибку.Массивы в Shell Script, а не 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. Если у вас есть идеи, я бы очень признателен. Благодаря!

+0

Какой дистрибутив? Или, какая оболочка '/ bin/sh' в вашей встроенной системе? –

+0

Я посмотрю в один момент, чтобы убедиться, но это должна быть та же оболочка, которая используется в debian. – TheLastFuzzy

+1

Линия 'if' имеет несбалансированные скобки и пробел между' '' и 'eq', поэтому я сначала исправлю эти проблемы. –

ответ

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

Я думаю, что должен это сделать! Спасибо Эллиот! – TheLastFuzzy

1

Это лучше не использовать eval если нет нет другой альтернативы. (Недавняя волна эксплойтов bash связана с внутренней оболочкой eval, содержащей содержимое переменных окружения, не проверяя сначала их содержимое). В этом случае вы, похоже, полностью контролируете задействованные переменные, но можете перебирать значения переменных без использования 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:

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

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

Выход через BusyBox 1.27.2 золы :

abc 
123 
def 
+2

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –