如何使用单支架grep?

时间:2015-06-25 03:40:36

标签: linux bash grep

我在an answer in another thread查看了bash脚本中与class Post(models.Model): def __unicode__(self): return self.post_title id = models.CharField( verbose_name='Post ID', primary_key=True, max_length=200 ) post_title = models.CharField( verbose_name='Post title', max_length=200 ) post_submitted_on = models.DateTimeField( verbose_name='Submitted on', null=True ) post_upvotes = models.IntegerField( verbose_name='Upvotes', null=True ) post_downvotes = models.IntegerField( verbose_name='Downvotes', null=True ) post_score = models.IntegerField( verbose_name='Score', null=True ) post_submitter = models.CharField( verbose_name='Submitted by', null=True, max_length=15 ) post_subreddit_id = models.CharField( verbose_name='Subreddit ID', null=True, max_length=200 ) post_comment_count = models.IntegerField( verbose_name='Number of comments', null=True ) post_permalink = models.URLField( verbose_name='Permalink', null=True ) post_url = models.URLField( verbose_name='Post URL', null=True ) post_subreddit = models.CharField( verbose_name='Subreddit', null=True, max_length=200 ) post_thumbnail = models.URLField( verbose_name='Thumbnail URL', null=True ) #post_is_self = models.BooleanField( # verbose_name='Is self post?', # null=True, # default=False #) post_selftext = models.TextField( verbose_name='Self post text', max_length=40000, default='Not a self post' ) 一起使用的括号对。 if不那么令人惊讶,并且具有更多功能,例如模式匹配([[),而=~[是内置的,并且POSIX兼容使它们可移植。

最近,我试图测试test命令的结果,但grep失败了。我正在使用[: too many arguments。但是,当我切换到[时它起作用了。我如何使用[[进行此类测试以保持可移植性?

这是失败的测试:

[

成功的测试:

#!/bin/bash

cat > slew_pattern << EOF
g -x"$
EOF


if [ $(grep -E -f slew_pattern /etc/sysconfig/ntpd) ]; then
        echo "slew mode"

else
        echo "not slew mode"

fi

1 个答案:

答案 0 :(得分:4)

if [ $(grep -E -f slew_pattern /etc/sysconfig/ntpd) ]; then

此命令肯定会因多次匹配而失败。当grep输出在行结束时被分割时,它将抛出错误。

grep的多个匹配由新行分隔,测试命令变为:

[ match1 match2 match3 ... ]

这没有多大意义。您将获得与grep返回的匹配数不同的错误消息(即测试命令[的参数数量)。

例如:

2次匹配会给您unary operator expected错误

3次匹配会给您binary operator expected错误和

超过3场比赛会在Bash中出现too many arguments错误等。

您需要引用[内的变量以防止分词。

另一方面,特定于Bash的[[会默认阻止分词。因此,grep输出不会在新行上拆分,而是保持单个字符串,这是测试命令的有效参数。

因此解决方案是仅查看grep的退出状态:

if  grep -E -f slew_pattern /etc/sysconfig/ntpd; then

或在捕获输出时使用引号:

if [ "$(grep -E -f slew_pattern /etc/sysconfig/ntpd)" ]; then

注意:

  1. 你真的不需要在这里捕获输出,只需查看退出状态即可。
  2. 此外,您可以禁止使用grep选项打印-q命令的输出,并使用-s选项打印错误。