将if-else语句转换为switch语句

时间:2014-05-04 12:54:15

标签: bash if-statement

我无法将此程序从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语句的状态,所以它可以读取和更快,特别是对于不像这个的大项目。

1 个答案:

答案 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[*]}"