在bash中将值传递给case语句

时间:2014-06-01 07:05:50

标签: bash shell scripting

我正在为shell脚本编写汇编程序的代码(下面是它的一部分)。它必须将汇编助记符转换为机器代码,这些代码在“代码”子程序内的情况下相应地映射。但是如果将$ currComm设置为“D = A”,那么现在将设置为A(comp子程序内部)的$ comp_mne在“代码”子程序中没有进入相应的情况。相反,它进入默认情况下打印“无效comp”。

comp()
{
    if [ `echo $currComm | awk '{print $2}'` = "=" ] ; then
        comp_mne="`echo $currComm | awk '{print $3}'`"
    elif [ `echo $currComm | awk '{print $2}'` = "\;" ] ; then
        comp_mne="`echo $currComm | awk '{print $1}'`"
    fi
    echo "comp is $comp_mne"
    code
}
code()
{
     echo "checking for comp $comp_mne"
     case "$comp_mne" in  
        "0") 
            echo -n "0101010-" >> ${file}.hack 
            ;;
        "1") 
            echo -n "0111111-" >> ${file}.hack 
            ;;
        "-1") 
            echo -n "0111010-" >> ${file}.hack 
            ;;
        "D") 
            echo -n "0001100-" >> ${file}.hack 
            ;;
        "A") 
            echo -n "0110000-" >> ${file}.hack
            echo "found" 
            ;;
        "!D") 
            echo -n "0001101-" >> ${file}.hack 
            ;;
        "!A") 
            echo -n "0110001-" >> ${file}.hack 
            ;;
        "-D") 
            echo -n "0001111-" >> ${file}.hack 
            ;;
        "-A") 
            echo -n "0110011-" >> ${file}.hack 
            ;;
        "D+1") 
            echo -n "0011111-" >> ${file}.hack 
            ;;
        *) 
            echo "Invalid comp"
            ;;
        esac
}

2 个答案:

答案 0 :(得分:0)

\`echo $currComm | awk '{print $2}'\`

计算包含这些命令的文字字符串;它执行这些命令。当你在一个角色前面放一个反斜杠时,角色失去了它的特殊含义并成为一个文字。

你想要的是这个:

"$(awk '{print $2}' <<< "$currComm")"
  • 摆脱不必要且有风险的echo。另一种安全方法是将echo替换为printf '%s'
  • Quotes值。
  • 使用现代command substitutions

答案 1 :(得分:0)

您的个案陈述可以有:

"D"*)   # Matches on any $comp_mne starting with D
        ;;

问题在于&#34; D + 1&#34;因为&#34; D&#34; *匹配$ comp_mne = D + 1,所以不会再触发低位的情况。所以你必须小心你所匹配的东西。