18

これは一種の比較演算子のようですが、たとえば次のコード(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-promptMinGWで動作させようとしていますが、MinGWで提供されているシェルはこの演算子をサポートしていないようです。

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

この特定のケースでは、ブロック全体をelipses_marker="…"(私の端末がユニコードをサポートしていることを知っているので)置き換えることができますが、これ=~は正確には何をしますか?

4

4 に答える 4

11

これは、組み込みコマンドへのbashのみの追加であり、[[正規表現のマッチングを実行します。文字列全体と完全に一致する必要はないため、「不正確な」一致を示すために記号が振られます。

この場合、$LC_CTYPE CONTAINSには文字列「UTF」が含まれます。

よりポータブルなバージョン:

if test `echo $LC_CTYPE | grep -c UTF` -ne 0 -a "$TERM" != "linux"
then
  ...
else
  ...
fi
于 2012-06-26T11:27:52.370 に答える
7

正規表現マッチングです。あなたのbashバージョンはまだそれをサポートしていないと思います。

この特定のケースでは、より単純な(そしてより高速な)パターンマッチングに置き換えることをお勧めします。

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

*(ここで引用してはならないことに注意してください)

于 2012-06-26T11:26:58.760 に答える
3

Rubyと同様に、RHSオペランドが正規表現である場合に一致します。

于 2012-06-26T11:24:53.427 に答える
2

正規表現に一致します

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
于 2012-06-26T11:23:44.567 に答える