gpt4 book ai didi

linux - 如何在单括号中使用 grep?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:12 26 4
gpt4 key购买 nike

我在看 an answer in another thread关于 bash 脚本中 if 使用哪个括号对。 [[ 不那么令人惊讶,并且具有更多功能,例如模式匹配 (=~) 而 [test 是内置且符合 POSIX 标准,使其具有便携性。

最近,我试图测试 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

以及成功的测试:

#!/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

最佳答案

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

对于多个匹配项,此命令肯定会失败。它会抛出错误,因为 grep 输出在行尾被拆分。

grep 的多个匹配用换行符分隔,测试命令变为:

[ match1 match2 match3 ... ]

这没有多大意义。根据 grep 返回的匹配项数量(即测试命令 [] 的参数数量),您将收到不同的错误消息。

例如:

2 场比赛会给你 unary operator expected 错误

3 场比赛会给你 binary operator expected 错误和

在 Bash 中,超过 3 个匹配会给你 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. 此外,您可以使用 -q 选项抑制 grep 命令的输出,使用 -s 选项抑制错误。

关于linux - 如何在单括号中使用 grep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31040817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com