2016-09-19 105 views
0

我试图一定数量从记录转换在一个普通的分号分隔文本文件与bash:case语句显示1和11之间没有区别吗?

group=$(echo $line | cut -d';' -f6) 

的可能值用于该列(6)的范围内1-20。 例如如果数字“11”被发现了,我必须把它转换为“5A”

  case ${group} in 

     [1]*) 
       group='1a'; 
       echo $group >> "$file" 
     esac 
     ;; 
     [11]*) 
       group='5a'; 
       echo $group >> "$file" 
      esac 
      ;; 

然而,每次我执行脚本从10-19的所有值都默认为[1]开关。 我试图引用类似[“11”]或['11']的开关,但没有成功。 如何正确切换10-19的值?

+0

不是你的代码在语法上不正确吗?你为什么有两个'esac'?第一个不应该在那里。 – euphoria83

回答

4

[11]相同[1]因为它是一个字符类/范围为1至1。

你真的不需要通配符如果你的价值观是数字:刚刚做的情况下是这样的:

 1) 
      group='1a'; 
      echo $group >> "$file" 
    esac 
    ;; 
    11) 
      group='5a'; 
      echo $group >> "$file" 
     esac 
     ;; 

(依此类推:默认情况下是*) BTW)

如果数字其次是字母,你可以这样做:

 1[a-z]) 
      group='1a'; 
      echo $group >> "$file" 
    esac 
    ;; 
    11[a-z]) 
      group='5a'; 
      echo $group >> "$file" 
     esac 
     ;; 

注意:如果你想匹配后跟111被任何东西,你可以这样做:

 11*) 
      group='5a'; 
      echo $group >> "$file" 
     esac 
     ;; 

    1*) 
      group='1a'; 
      echo $group >> "$file" 
    esac 
    ;; 

(第2情况下将匹配由1开始而不是由11注开始的所有数字,我已经扭转了这种情况,首先是最准确的匹配)。

做出选择:)

+0

Fabre:按照你的建议反转switch-statement,对我来说效果很好 – kzpm

+0

很酷!由于我不知道你的代币的形式,我只是发布了一个详尽的解决方案。 –

相关问题