2014-02-18 68 views
3

具有的bash似乎不可用,创建简单的脚本用于通过它访问数组元素的index.It如下枚举数据类型在bash

#! /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给指数是好的,如果变量通过像

enum index { OK_INDEX, CANCEL_INDEX, ERROR_INDEX,CONFIRM_INDEX,SAVE_INDEX,EXIT_INDEX}; 
autometically获得价值像C语言为 ENUM数据类型

在C中,它是可能的

在bash中有没有其他的ENUM

我发现很多,但再没有succeded有尝试一些技巧来实现这一点如下

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. 没有预防/检测mistypings的(但这是罕见的在脚本反正)
+0

正如你已经知道,通常ENUM提高了程序的可读性,枚举常数会自动生成。所以它会帮助我,如果我宣布数组超过100个项目,那么我只需要添加索引名称不需要分配value.without枚举如果我错过了分配值,那么会发生一些怪异的东西。这就是为什么我喜欢在我的脚本枚举。感谢您的回复。 –