枚举数据types在bash中似乎不可用

有了bash,创build了简单的脚本来访问它的索引数组元素,如下所示

#! /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]} 

从上面的脚本我需要声明适当的索引variables从数组列表中检索有效的消息,但它可能不便于我声明每个variables,并给他们的索引。很好,如果variablesautometically获得像C中的ENUM数据types

在C中是可能的

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

ENUM在bash中有没有其他select?

我发现很多,但没有成功,然后尝试一些伎俩来实现这一点如下

 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 

所以形成上面的代码片段,我成功地创build了常量,但似乎冗长的意思就是声明variables我需要写5-10行代码,这是不公平的。

那么任何一个有另一个解决scheme

尝试下面的代码片段…我想这是你想要的

 #!/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 

当需要枚举时,典型的解决方法是使用普通字符串。 在这些情况下,我甚至会忽略关于变量评估的强制性引用:

  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(但这是在剧本罕见)