在 bash shell 中模拟枚举语义
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17193107/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
emulate enum semantics in the bash shell
提问by user311174
I was trying to emulate the C enum semantics with arrays but without much sucess, basically i want to be able to iterate through a set of items and also declare a variable just by using an identifier like this:
我试图用数组模拟 C 枚举语义,但没有取得多大成功,基本上我希望能够遍历一组项目,并仅通过使用这样的标识符来声明一个变量:
$ bash -version
GNU bash, versión 4.1.10(4)-release (i686-pc-cygwin)
bad attempt:
错误的尝试:
#!/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
output:
输出:
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
The bottom question is not about the correctness of the above code, instead i have a script with states and transitions, and i dont want to remember each state by and index, i want to use labels instead.
最根本的问题不是关于上面代码的正确性,而是我有一个带有状态和转换的脚本,我不想通过索引来记住每个状态,我想改用标签。
Thanks!
谢谢!
回答by Jester
If you are happy with using a few $signs here and there, how about you declare some constants:
如果您对$在这里和那里使用一些符号感到满意,那么您声明一些常量如何:
#!/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

