2012-06-26 6 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="…" (내 터미널이 유니 코드를 지원한다는 것을 알고 있기 때문에) 블록 전체가 정확히 =~일까요? 우변 피연산자 정규식이다

답변

10

이 떠들썩한 전용입니다 내장 된 [[ 명령에 추가하여 정규 표현식 일치를 수행합니다. 전체 문자열과 정확히 일치 할 필요는 없으므로 "정확하지 않은"일치를 나타 내기 위해 기호가 웨이브됩니다. 이 경우

, $LC_CTYPE 문자열 "UTF을"이 포함 된 경우.

더 많은 휴대용 버전 : 대신 정규식의 리터럴 문자열이된다

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

backticks에서 grep을 실행할 필요가 없습니다. 'echo $ LC_TYPE | grep -Fq UTF && test "$ TERM"! = linux; 그 다음에 ' –

+0

읽을 수있는 코드를 장려하는 중 ... 하나의'테스트 '와 첫 번째'표현 '을 둘러싼 역 따옴표만으로 더 직관적 인 표현으로 보입니다. (그리고 grep -q는 오류에서도 마찬가지입니다.) :-)하지만 동의합니다. 나는'test'를 너무 자주 사용하는 습관을 가지고 있지만''if :''파이프보다 읽기 쉽다고 생각합니다. – MattBianco

+0

"grep -q가 오류에서도 true"라는 것은 무엇을 의미합니까? –

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 
+2

당신이 (배쉬 3.2 현재) 정규식을 인용합니다. –

3

로부터 다음의 예를 참조는 일치한다.

6

정규 표현식 일치입니다. 나는 bash 버전이 아직 그것을 지원하지 않는다고 생각한다. 이 특별한 경우

, 나는 간단하게 (빠르게) 패턴 매칭으로 대체 좋을 것 :
[[ $LC_CTYPE == *UTF* && $TERM != "linux" ]] 

이 ( * 여기에 인용되어야 함을 참고)

관련 문제