2012-06-26 3 views
15

比較演算子のようなものですが、正確にはどのような演算子であるのでしょうか。次のコード(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 

私は現在、MinGWの下で働くためにgit-promptを作るしようとしている、とMinGWの付属のシェルは、この演算子をサポートしていないようです:私はちょうど置き換えることができ、この特定のケースでは

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

elipses_marker="…"のブロック全体(私の端末がユニコードをサポートしていることを知っている)が、正確には=~は何ですか? RHSオペランドは正規表現です

答えて

10

それは専用bashのです組み込みの[[コマンドに加えて、正規表現のマッチングを実行します。それは完全な文字列の完全一致である必要はないので、シンボルは「不正確」の一致を示すために波打つ。

この場合、$LC_CTYPEが含まれている場合は、文字列「UTF」がになります。

その他のポータブル版:

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

バッククォートでgrepを実行する必要はありません。 'もしエコー$ LC_TYPE | grep -Fq UTF && test "$ TERM"!= linux; ' –

+0

読みやすいコードを奨励しようとしています...私は、それが式のように見えるように、最初の "式"を取り囲む1つの 'test'とバックティックでより直感的です。 (そして、grep -qも同様にエラーになります):-)しかし、私は同意します。私は 'test'を頻繁に使う傾向がありますが、' 'if:' 'パイプよりも読みやすいと思います。 – MattBianco

+0

「grep -qはエラーでも真」とはどういう意味ですか?興味深いもの: –

2

それはマッチする正規表現

はRubyのような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 
+2

あなたは(バッシュ3.2のような)正規表現を引用した場合、それは代わりに正規表現の文字列リテラルとなります。 –

3

から次の例を参照してください、それが一致しました。

6

正規表現に一致します。私はあなたのbashのバージョンはまだそれをサポートしていないと思います。

この特定のケースでは、私はシンプルな(かつ迅速)に置き換えることをお勧めしたいが、パターンマッチング:

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

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

関連する問題