【问题标题】:What does the "=~" operator do in shell scripts?"=~" 运算符在 shell 脚本中的作用是什么?
【发布时间】:2012-06-27 16:56:36
【问题描述】:

它似乎是一种比较运算符,但它到底是做什么的,例如以下代码(取自https://github.com/lvv/git-prompt/blob/master/git-prompt.sh#L154)?

    if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]];  then
            elipses_marker="…"
    else
            elipses_marker="..."
    fi

我目前正在尝试使 git-prompt 在 MinGW 下工作,而 MinGW 提供的 shell 似乎不支持此运算符:

conditional binary operator expected
syntax error near `=~'
`        if [[ $LC_CTYPE =~ "UTF" && $TERM != "linux" ]];  then'

在这种特定情况下,我可以将整个块替换为 elipses_marker="…"(我知道我的终端支持 unicode),但是这个 =~ 到底是做什么的?

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    这是对内置[[ 命令的一个仅限 bash 的补充,执行正则表达式匹配。由于它不必与完整字符串完全匹配,因此挥动该符号以表示“不精确”匹配。

    在这种情况下,如果$LC_CTYPE 包含字符串“UTF”。

    更便携的版本:

    if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux"
    then
      ...
    else
      ...
    fi
    

    【讨论】:

    • 不需要在反引号中运行 grep。 if echo $LC_TYPE | grep -Fq UTF && test "$TERM" != linux; then
    • 试图鼓励可读的代码...我发现它更直观,只有一个 test 和第一个“表达式”周围的反引号,使它看起来像一个表达式。 (而且 grep -q 也会出现错误):-) 但我同意。我有经常使用test 的习惯,但我认为它比if:ing 管道更具可读性。
    • “grep -q 在出错时也为真”是什么意思?
    • 有趣。供参考:pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html "如果指定了 -q 选项,如果选择了输入行,则退出状态应为零,即使检测到错误。否则,应执行默认操作。"
    • 让我吃惊的是,grep 在错误上成功实际上是这里想要的行为。
    【解决方案2】:

    这是一个正则表达式匹配。我猜你的 bash 版本还不支持。

    在这种特殊情况下,我建议用更简单(更快)的模式匹配替换它:

    [[ $LC_CTYPE == *UTF* && $TERM != "linux" ]]
    

    (注意这里不能引用*

    【讨论】:

      【解决方案3】:

      与 Ruby 一样,它匹配 RHS 操作数为正则表达式的位置。

      【讨论】:

        【解决方案4】:

        匹配正则表达式

        参考http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF下面的例子

        #!/bin/bash
        
        input=$1
        
        
        if [[ "$input" =~ "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]]
        #                 ^ NOTE: Quoting not necessary, as of version 3.2 of Bash.
        # NNN-NN-NNNN (where each N is a digit).
        then
          echo "Social Security number."
          # Process SSN.
        else
          echo "Not a Social Security number!"
          # Or, ask for corrected input.
        fi
        

        【讨论】:

        • 如果你引用正则表达式(从 Bash 3.2 开始),它会变成文字字符串而不是正则表达式。
        猜你喜欢
        • 2013-12-03
        • 2018-06-12
        • 1970-01-01
        • 2015-02-07
        • 2022-09-22
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2016-06-20
        相关资源
        最近更新 更多