我在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
答案 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
注意:
grep
选项打印-q
命令的输出,并使用-s
选项打印错误。