如何检查&if; then-then-else-fi'中的多个字符串?在linux中?

时间:2014-07-22 19:37:40

标签: linux bash shell unix

我有一个名为'testfile'的文件,其中包含:

Computer Science   123 Congress Street,
Biology            2 New York Ave,
Graduate Center    1 New York Ave

我有一个名为'search'的脚本,如下所示:

grep $* testfile
____________________                 # line 2
then echo "there is a match"         # message 1
else echo "no such department found" # message 2
fi

它应该打印出“计算机科学”,“生物学”和“研究生中心”部门的“匹配”。如果没有上述部门,“没有这样的部门找到”。

所以我正在尝试#line2。 我对此几乎没有问题:

(1)是否可以在'if'中再次写'grep'?例如我能这样写吗

  

if grep -q Biology“$ testfile”

。如果是,我如何测试所有字符串(在本例中为'部门')?

(2)我知道如果我只使用grep来找到我说的多个字符串

  

grep'string1 \ | string2 \ | string3'PATH

OR

  

egrep -w'string1 | string2'PATH

但是我可以在if语句中使用这种格式吗?如果是,怎么样?

(3) 有可能这样做吗? :

  

如果[“$”==“计算机科学”] || [“$”==“生物学”] || [“$”==“研究生中心”]

有人可以帮我澄清一下我的疑惑吗?

2 个答案:

答案 0 :(得分:1)

shell if语句采用任意shell命令。如果该命令无论它是什么,则将成功退出then子句;否则,将执行else子句。所以你的第一个问题的答案是,是的,你可以写if grep -q 'pattern' testfile,你也可以写if egrep -qw 'string1|string2' testfile,如果你真的想要,你甚至可以写if perl -ne '(hundreds of lines of code here)' testfile

如果我理解正确,你的脚本会将字符串列表作为参数,如果所有字符串匹配,你希望它打印“有匹配”。我会这样做:

success=y
for arg in "$@"
do
  if grep -qF "$arg" "$testfile"
  then :
  else
    printf 'no match for %s\n' "$arg"
    success=n
  fi
done
if [ "$success" = "y" ]; then
  printf 'all strings matched\n'
fi

then :; else ...构造是唯一的可移植方式来反转shell if语句的意义; if ! ...是一种基础。如果你不是关心最大可移植性,不要编写shell脚本; Perl 更多可能比Bash更可用于跨平台。-q-F参数{ {1}}也不是完全可移植的,grep也不是,但我没有绊过自2000年代中期以来没有它们的系统。)

答案 1 :(得分:0)

我尝试使用以下脚本解决此问题,它成功运行。最初我提交了我的输入字符串。并尝试输入字符串与testfile中已存在的字符串匹配。但目的是只使用一行'如果'介于' grep'之间然后'然后' 如果有的话,请提交其他答案。

grep $* directory
echo -e "Hi, please type the word: \c "
read  word
echo "The word you entered is: $word"

if echo "Biology\|Computer Science\|Graduate Center MO" | grep -q "$word"
then 
echo "there is a match"
else 
echo "no such department found"
fi