我有一个名为'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) 有可能这样做吗? :
如果[“$”==“计算机科学”] || [“$”==“生物学”] || [“$”==“研究生中心”]
有人可以帮我澄清一下我的疑惑吗?
答案 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