检查char是否在set内

时间:2013-09-08 14:00:05

标签: bash

我正在尝试检查长度为1的字符串是否只有以下字符:[RGWBO]。

我正在尝试以下但是它不起作用,我错过了什么?

if [[ !(${line[4]} =~ [RGWBO]) ]];

4 个答案:

答案 0 :(得分:2)

这就是你想要的:

if [[ ${line[4]} =~ ^[RGWBO]+$ ]];

这意味着从开始到结束的字符串必须具有[RGWBO]字符一次或多次。

如果您想否定表达式,请在!前面使用[[ ]]

if ! [[ ${line[4]} =~ ^[RGWBO]+$ ]];

或者

if [[ ! ${line[4]} =~ ^[RGWBO]+$ ]];

答案 1 :(得分:1)

这个适用于任何可用的Bash版本:

[[ -n ${LINE[0]} && ${LINE[0]} != *[^RGWB0]* ]]

即使我更喜欢扩展球的简单性:

shopt -s extglob
[[ ${LINE[0]} == +([RGWBO]) ]]

答案 2 :(得分:0)

方法

  1. 使用${#myString}测试字符串长度,如果它是1,则继续执行步骤2;
  2. 包含您的模式。
  3. 代码

    re='[RGWBO]'; 
    while read -r line; do
      if (( ${#line} == 1 )) && [[ $line == $re ]]; then
        echo "yes: $line"
      else 
        echo "no: $line" 
      fi
    done < test.txt
    

    资源

    您可能需要查看以下链接:

    数据

    test.txt文件包含此

    RGWBO
    RGWB
    RGW
    RG
    R
    G
    W
    B
    O
    V
    

答案 3 :(得分:0)

使用expr(表达式评估程序)执行substring matching

#!/bin/bash
pattern='[R|G|W|B|O]'
string=line[4]
res=`expr match "$string" $pattern`

if [ "${res}" -eq "1" ]; then
  echo 'match'
else
  echo 'doesnt match'
fi