2014-02-18 2 views
3

Имея Баш, создал простые сценарии для доступа к элементу массива по его index.It следующегоперечисления кажется, не доступен в Баше

#! /bin/bash 

OK_INDEX=0 
CANCEL_INDEX=1 
ERROR_INDEX=2 
CONFIRM_INDEX=3 
SAVE_INDEX=4 
EXIT_INDEX=5 
declare -a messageList=("ok" 
         "cancel" 
         "error" 
         "confirm" 
         "save" 
         "exit") 

printf "%s \n" ${messageList[$CANCEL_INDEX]} 

из выше сценариев, мне нужно, чтобы объявить правильные индексные переменный, чтобы получить правильное сообщение от список массив, но это, вероятно, не удобно для меня, чтобы объявить каждую переменную и дать индекс them.It хорошо, если переменная autometically получает значение, как, как в C для типа

ENUM данных в C это возможно благодаря как

enum index { OK_INDEX, CANCEL_INDEX, ERROR_INDEX,CONFIRM_INDEX,SAVE_INDEX,EXIT_INDEX}; 

есть альтернативные варианты для ENUM в bash?

я нашел много, но не преуспели, то есть попробовать трюк, чтобы достичь этого заключается в следующем

ENUM=(OK_INDEX CANCEL_INDEX ERROR_INDEX CONFIRM_INDEX SAVE_INDEX EXIT_INDEX) 

maxArg=${#ENUM[@]} 

for ((i=0; i < $maxArg; i++)); do 
    name=${ENUM[i]} 
    declare -r ${name}=$i 
done 

Так образуют выше фрагмент кода я успешно создан постоянный, но это, кажется, длинные средства просто Объявляем переменную мне нужно написать Код 5-10 строк, который не справедлив.

У кого-нибудь есть другое решение?

ответ

2

Попробуйте следующий фрагмент кода ... Я думаю, что это то, что вы хотите

#!/bin/bash 
set -u 
DEBUG=1 

# This funcion allow to declare enum "types", I guess 
enum() 
{ 
    # skip index ??? 
    shift 
    AA=${@##*\{} # get string strip after { 
    AA=${AA%\}*} # get string strip before } 
    AA=${AA//,/} # delete commaa 
    ((DEBUG)) && echo $AA 
    local I=0 
    for A in $AA ; do 
     eval "$A=$I" 
     ((I++)) 
    done 
} 

### Main program 
# Just declare enum as you need 
enum index { OK_INDEX, CANCEL_INDEX, ERROR_INDEX, CONFIRM_INDEX, SAVE_INDEX, EXIT_INDEX }; 
# Print value of enumerated items 
echo $OK_INDEX 
echo $CANCEL_INDEX 
echo $ERROR_INDEX 
echo $CONFIRM_INDEX 
echo $SAVE_INDEX 
echo $EXIT_INDEX 

# Use enumerated index in program 
I=CONFIRM_INDEX 
case $I in 
    OK_INDEX) 
     echo "Process here when index is $I" 
    ;; 
    CANCEL_INDEX) 
     echo "Process here when index is $I" 
    ;; 
    ERROR_INDEX) 
     echo "Process here when index is $I" 
    ;; 
    CONFIRM_INDEX) 
     echo "Process here when index is $I" 
    ;; 
    SAVE_INDEX) 
     echo "Process here when index is $I" 
    ;; 
    EXIT_INDEX) 
     echo "Process here when index is $I" 
    ;; 
esac 

exit 0 
+0

действительно ценю, что вы помогаете, но это также один трюк для объявленной переменной, напишите некоторый код. В вашем скрипте вы реализуете функциональность «enum», которая дает индекс каждому элементу. В любом случае появилась новая идея. –

1

Типичным обходным путем, когда требуется перечислить, является использование обычных строк. В этих случаях я даже опустить в противном случае обязательных кавычек переменной оценки:

state=IDLE 
... 
while [ $state = IDLE ] 
do 
    ... 
    if condition 
    then 
    state=BUSY 
    fi 
    ... 
    if condition2 
    then 
    state=ERROR 
    fi 
    ... 
done 
if [ $state = ERROR ] 
then 
    ... 
fi 

Таким образом, конечно, у вас есть только базовые функции названных государств и ни один из следующих обычно связанных с особенностями перечислений:

  1. декларирование всех возможных значений (самодокументированно код)
  2. соответствующий номер для каждого значения (дело вкуса, если это особенность или бородавка)
  3. нет предотвращения/обнаружения опечаток (но это редко в сценариях в любом случае)
+0

Как вы уже знаете, что правило ENUM улучшена программа читаемость, перечисляемые константы генерируются автоматически. Поэтому мне будет полезно, если я объявлю массив более 100 элементов, тогда мне просто нужно добавить имя индекса, чтобы не требовать присвоения значения. Без перечисления, если я пропустил присвоение значения, тогда что-то пойдет странно. Поэтому я предпочитаю перечисление в моих сценариях. Спасибо за ваш ответ. –

Смежные вопросы