【问题标题】:How to egrep variable-Unix shell script如何 egrep 变量-Unix shell 脚本
【发布时间】:2010-12-14 03:27:14
【问题描述】:

我正在尝试使用 egrep 和 regex 验证输入。这是来自脚本 (c-shell) 的行:

echo $1 | egrep '^[0-9]+$'
if ($status == 0) then
set numvar = $1
else
    echo "Invalid input"
    exit 1
endif

如果我通过管道 echo 到 egrep 它可以工作,但它也会在屏幕上打印变量,这是我不需要的。

【问题讨论】:

    标签: shell unix csh


    【解决方案1】:

    要简单地抑制输出,您可以将其重定向到空设备。

    echo $1 | egrep '^[0-9]+$' >/dev/null
    if ($status == 0) then
    set numvar = $1
    else
        echo "Invalid input"
        exit 1
    endif
    

    您可能还想考虑使用-c 选项来获取匹配数,而不是使用状态。

    另外,除非您使用csh,否则状态将存储在$? 而不是$status

    【讨论】:

    • 我按照您的建议使用了 -c 选项,并且我还设置了要在 if 语句中使用的新变量。设置 temp = echo $1 | egrep -c '^[0-9]+$' if ($temp != 0) then
    • 在csh中,退出状态确实保存在$status
    • 我添加了一个关于 csh 的说明,并将添加一个 csh 标签。
    【解决方案2】:

    grep 有一个抑制输出的-q 选项

    所以:

    egrep -q '^[0-9]+$'
    

    【讨论】:

    • 手册页说:“可移植的 shell 脚本应该避免使用 -q 和 -s 并且应该将标准和错误输出重定向到 /dev/null。(-s 由 POSIX 指定。)”
    • @Dennis - 关于可移植性问题,您是对的。实际上 -s 和 -q 选项都是由 POSIX 指定的。 -q 选项以我在这里使用的方式起作用,-s 选项抑制错误消息。见gnu.org/software/grep/manual/html_node/…
    • 便携式 shell 脚本可能不会用 csh 编写
    【解决方案3】:

    你可以使用 awk

    $ echo "1234" | awk '{print $1+0==$1?"ok":"not ok"}'
    ok
    $ echo "123d4" | awk '{print $1+0==$1?"ok":"not ok"}'
    not ok
    

    【讨论】:

    • 谢谢,但我更喜欢 egrep,只是因为我不知道 awk。以后可能会在之前给它,但目前我没有时间学习它。
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多