bash:测试是否设置了$ WORD


54

我正在寻找中的构造bash,以确定变量$WORD是否为已定义单词之一。我需要这样的东西:

if "$WORD" in dog cat horse ; then 
    echo yes
else
    echo no
fi

bash有这样的构造吗?如果没有,最接近的是什么?

Answers:


57

这是一个使用正则表达式的仅Bash(> =版本3)解决方案:

if [[ "$WORD" =~ ^(cat|dog|horse)$ ]]; then
    echo "$WORD is in the list"
else
    echo "$WORD is not in the list"
fi

如果单词列表很长,可以将其存储在文件中(每行一个单词),然后执行以下操作:

if [[ "$WORD" =~ $(echo ^\($(paste -sd'|' /your/file)\)$) ]]; then
    echo "$WORD is in the list"
else
    echo "$WORD is not in the list"
fi

文件方法的一个警告:

  • 如果文件带有空格,它将中断。可以通过以下方式补救:

    sed 's/[[:blank:]]//g' /your/file | paste -sd '|' /dev/stdin

感谢@terdon提醒我正确使用^和锚定模式$


1
而且shopt -s nocasematch可能会帮助,如果你希望搜索不区分大小写。
Skippy le Grand Gourou 2014年

1
请注意,您必须使用[[]]- [并且]还不够。
格雷格·杜比奇

我正在寻找一个“单身汉”来验证我的脚本参数,因此效果很好。谢谢![[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
RASG


11

怎么样:

#!/usr/bin/env bash

WORD="$1"
for w in dog cat horse
do
  if [ "$w" == "$WORD" ] 
  then
      yes=1
      break
  fi
done;
[ "$yes" == "1" ] && echo "$WORD is in the list" || 
                     echo "$WORD is not in the list"

然后:

$ a.sh cat
cat is in the list
$ a.sh bob
bob is not in the list

3
if (echo "$set"  | fgrep -q "$WORD")

1
小心一点,如果$WORD为空,它将返回true ,如果WORD=caWORD=og或类似,它将匹配,我认为您的意思是echo ${set[@]}
terdon

只需在grep中添加-w即可避免出现部分单词
BrenoZan 2014年

1

您可以为此定义一个bash函数:

function word_valid() 
{ 
  if [ "$1" != "cat" -a "$1" != "dog" -a "$1" != "horse" ];then
    echo no
  else
    echo yes
  fi
}

然后像这样简单地使用:

word_valid cat

1

我正在寻找一种“单行”解决方案来验证我的脚本参数,并使用上述的Joseph R.答案得出了:

[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }


0

这为我工作:

#!/bin/bash
phrase=(cat dog parrot cow horse)
findthis=parrot

for item in ${phrase[*]}
do
    test "$item" == "$findthis" && { echo "$findthis found!"; break; }
done

0

您可能希望将单词列表放入文件中,以防您经常更改列表,或者希望它被多个脚本共享。如果列表太长而无法在脚本中进行管理,则可能需要将单词放入文件中。那你可以说

if fgrep qx "$WORD" word_list

不,我不想将列表保存在文件中
Martin Vegter 2014年

0

如果单词是一个列表,其中值之间用换行符分隔,则可以执行以下操作:

WORDS="$(ls -1)"
if echo "${WORDS}" | grep --quiet --line-regexp --fixed-strings "${WORD}"; then
    echo yes
else
    echo no
fi

0

您可以使用fgrep指定所有允许的单词:

if $(echo "$WORD" | fgrep -wq -e dog -e cat -e horse) ; then 
    echo yes
else
    echo no
fi

-w标志仅匹配完整的单词,该-q标志使其静默运行(因为我们需要的只是要使用的if语句的返回值),并且每个-e模式都指定一个允许的模式。

fgrep是执行常规字符串匹配而不是正则表达式匹配的grep版本。如果你有grep,你应该有fgrep,但如果不是,它等同于使用grep-F标志(这样你就只需更换fgrep -wq以上grep -Fwq)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.