我无法将此程序从if-else语句转换为switch语句。任何帮助将不胜感激。
#!/bin/bash
for x in $@
do
array[$i]=$x
i=$((i+1))
done
# initial state
state=S0
for((i=0;i<${#array[@]};i++))
do
if [ $state == S0 ]
then
if [ ${array[$i]} == I0 ]
then
state=S1
output[$i]=O1
elif [ ${array[$i]} == I1 ]
then
state=S0
output[$i]=O0
fi
elif [ $state == S1 ]
then
if [ ${array[$i]} == I0 ]
then
state=S1
output[$i]=O1
elif [ ${array[$i]} == I1 ]
then
state=S0
output[$i]=O0
fi
fi
done
echo "final state="$state
echo "output="${output[@]}
对于那些想知道脚本的人..这个关于有限状态机的脚本..这个脚本有两个我想要转换为case语句的状态,所以它可以读取和更快,特别是对于不像这个的大项目。
答案 0 :(得分:2)
首先,明智地缩进对于维护代码有很大帮助。
一个错误,在if语句中使用单括号 - 如果比较左侧的变量为空,则会出现语法错误。使用双括号或在变量周围使用双引号。这一点非常重要,因为您需要从用户那里获取信息,并且您永远不会知道自己会得到什么。
#!/bin/bash
for x in "$@"; do
array[$i]=$x
((i++))
done
# initial state
state=S0
for ((i=0; i<${#array[@]}; i++)); do
if [[ $state == S0 ]]; then
if [[ ${array[$i]} == I0 ]]; then
state=S1
output[$i]=O1
elif [[ ${array[$i]} == I1 ]]; then
state=S0
output[$i]=O0
fi
elif [[ $state == S1 ]]; then
if [[ ${array[$i]} == I0 ]]; then
state=S1
output[$i]=O1
elif [[ ${array[$i]} == I1 ]]; then
state=S0
output[$i]=O0
fi
fi
done
echo "final state="$state
echo "output="${output[@]}
我发现无论状态是S0还是S1,你都做同样的事情,所以你可以删除那部分。此外,可以简化填充数组变量。离去:
#!/bin/bash
array=( "$@" )
state=S0
for ((i=0; i<${#array[@]}; i++)); do
if [[ ${array[$i]} == I0 ]]; then
state=S1
output[$i]=O1
elif [[ ${array[$i]} == I1 ]]; then
state=S0
output[$i]=O0
fi
done
echo "final state: $state"
echo "output: ${output[*]}"
鉴于这一切,我并没有真正看到帮助你的案例陈述。但如果你想:
#!/bin/bash
array=( "$@" )
state=S0 # initial state
for ((i=0; i<${#array[@]}; i++)); do
case ${array[$i]} in
I0) state=S1; output[$i]=O1 ;;
I1) state=S0; output[$i]=O0 ;;
esac
done
echo "final state: $state"
echo "output: ${output[*]}"