2013-06-19 37 views
1

我试图模仿C语言的枚举语义与数组,但没有太多的成功,基本上我想能够迭代通过一组项目,还声明一个变量只是通过使用一个标识符像这样的:在bash shell中模拟枚举语义

$ bash -version 
GNU bash, versión 4.1.10(4)-release (i686-pc-cygwin) 

不良企图:

#!/bin/bash 
    STATES=(INITIAL DEFAULT_CS_SETUP CREATED_CS CHECKED_OUT_DIR MKELEMENT_FILE\ 
CREATED_BRANCH CHECKED_IN_DIR COMPLETE) 
    tam=${#STATES[@]} 
    dereference() 
    { 
     tam=${#STATES[@]} 
     for ((j=0; j < $tam; j++)); do 
      if [[ "$state" == ${STATES[j]} ]];then 
      echo $j 
      break 
     fi 
     done 
    } 

    echo get the INITIAL state 
    state=INITIAL 
    echo ${STATES[`dereference`]} 

    echo get the next state from CREATED_CS 
    state=CREATED_CS 
    echo ${STATES[`dereference`+1]} 

    echo list elements from CREATED_CS to the end 
    state=CREATED_CS 
    for ((i=`dereference`; i < $tam; i++)); do 
     echo ${STATES[$i]} 
    done 

    echo list elements from CREATED_CS to CREATED_BRANCH is really awkward 
    state=CREATED_BRANCH 
    tmp_ind=`dereference` 
    state=CREATED_CS 
    for ((i=`dereference`; i <= $tmp_ind; i++)); do 
     echo ${STATES[$i]} 
    done 

输出:

get the INITIAL state 
INITIAL 
get the next state from CREATED_CS 
CHECKED_OUT_DIR 
list elements from CREATED_CS to the end 
CREATED_CS 
CHECKED_OUT_DIR 
MKELEMENT_FILE 
CREATED_BRANCH 
CHECKED_IN_DIR 
COMPLETE 
list elements from CREATED_CS to CREATED_BRANCH is really awkward 
CREATED_CS 
CHECKED_OUT_DIR 
MKELEMENT_FILE 
CREATED_BRANCH 

ŧ他最基本的问题不是关于上面的代码的正确性,而是我有一个脚本与状态和转换,我不想记住每个状态和索引,我想用标签来代替。

谢谢!

回答

3

如果你很高兴与使用一些$迹象在这里和那里,你怎么样声明一些常量:

#!/bin/bash 

STATES=(INITIAL DEFAULT_CS_SETUP CREATED_CS CHECKED_OUT_DIR MKELEMENT_FILE CREATED_BRANCH CHECKED_IN_DIR COMPLETE) 
tam=${#STATES[@]} 
for ((i=0; i < $tam; i++)); do 
    name=${STATES[i]} 
    declare -r ${name}=$i 
done 

echo get the INITIAL state 
echo ${STATES[$INITIAL]} 

echo get the next state from CREATED_CS 
echo ${STATES[$CREATED_CS+1]} 

echo list elements from CREATED_CS to the end 
for ((i=$CREATED_CS; i < $tam; i++)); do 
    echo ${STATES[$i]} 
done 

echo list elements from CREATED_CS to CREATED_BRANCH 
for ((i=$CREATED_CS; i <= $CREATED_BRANCH; i++)); do 
    echo ${STATES[$i]} 
done 
+0

+1唯一要注意的是,通过保持信息的两倍,我要记得还重现常量如果我添加或减去数组中的元素 – user311174

+0

如果将它像我一样放在代码中,则不必担心这一点。只需更新数组,常量将自动创建。 – Jester