2017-05-22 8 views
2

var (키보드의 사용자 입력)이 대/소문자를 구분하지 않고 정규식과 일치하는지 확인하는 것이 더 나은지 알고 싶습니다. 나는 다른 가능성이 있다는 것을 압니다. 예 : Y, Ny는, nYes, No, YES,배쉬 대/소문자를 구별하지 않는 regex (더 우아한) 방법?

NO 내가 다른 방법을 찾고 검색 :이 목록의 빈 값과 모두 일치하는 정규 표현식을 원한다. 다른 것이 더 좋을지 확실하지 않습니다. 나는 그들을 위해 일하는 몇 가지를 놓을 게.

  • 첫 번째는 비교 자로 모든 설정 작은 "까다로운"이다

    #!/bin/bash 
    yesno="null" #any different value for initialization is valid 
    while [[ ! ${yesno^^} =~ ^[YN]$|^YES$|^NO$|^$ ]]; do 
        read -r yesno 
    done 
    
  • 번째는 shopt -s nocasematch을 사용한다. 그러나 모든 스크립트에 대해 이것을 설정하고 싶지 않기 때문에 되돌릴 수 있는지 확실하지 않습니다.

    #!/bin/bash 
    yesno="null" #any different value for initialization is valid 
    shopt -s nocasematch 
    while [[ ! ${yesno} =~ ^[yn]$|^yes$|^no$|^$ ]]; do 
        read -r yesno 
    done 
    

다음 정규식은 어떤 방식으로 개선 얻을 수 있습니까? 더 좋은 (더 우아한) 방법이 있습니까? 두 번째 방법은 해당 설정을 되돌릴 수 있습니까?

감사합니다.

+0

'declare -l yesno; yesno = "예"; echo "$ yesno"'? – Cyrus

+2

'shopt -s nocasematch'를 되돌리려면 :'shopt -u nocasematch'. 참고 :'help shopt' – Cyrus

답변

1

shopt은 변수 yesno에 원래 입력 된 값을 유지할 수있는 좋은 접근 방식입니다.

당신은 당신의 정규식을 약간 리팩토링 할 수

#!/bin/bash 

yesno="null" 

# set nocasematch option 
shopt -s nocasematch 

while [[ ! ${yesno} =~ ^([yn]|yes|no)?$ ]]; do 
    read -r -p "Enter a yes/no value: " yesno 
done 

# unset nocasematch option 
shopt -u nocasematch 

# examine your variable 
declare -p yesno 
1

먼저 소문자로 문자열을 변환하고이를 확인할 수 있습니다. 그렇다면 nocasematch을 전혀 건드릴 필요가 없습니다.

# use the ${var,,} syntax to conver to lowercase 
while [[ ! ${yesno,,} =~ ^(y|n|yes|no)$ ]]; do 
    read -r -p "yes/no? " yesno 
done