2009-11-11 2 views
3

후속 질문에 대한 정책이 여기에 무엇인지 확실하지 않습니다. 그러니 제가 프로토콜을 어기면 저를 용서해주십시오. 이전에 bash (Here)의 메뉴를 구성 중이었습니다.Bash Case 메뉴 - 동적 선택

그리고 지금까지는 정말 잘 작동했습니다. 여기 코드. 메뉴는 동적 될 것입니다 최대 9에 메뉴 항목의 위대한 작품 - - 제외

while [[ 1 ]] 
do 
    cat -n "$dumpfile" 
    read -p "Please make a selection, select q to quit: " choice 
    case $choice in 
      # Check for digits 
    [0-9]) dtvariable=$(sed -n "$choice"p "$dumpfile") 
       $dtvariable   ;; 
    q|Q) 
     break 
      ;; 
     *) 
      echo "Invalid choice" 
      ;; 
    esac 
done 

1 개 항목, 20 개 항목, 또는 197 개 항목을 가질 수 있습니다. 나는 [0-9]가 [0-9] [0-9]가되도록 변화 시켜서 12가 걸릴지 알아 보았습니다.하지만 그렇지 않습니다. 누구든지 나를 올바른 길로 인도 할 수 있습니까? 나는 [0-9] 부분을 제거하고 q가 아닌 것을 가져갈 수 있다고 생각합니다. 하지만 숫자를 찾는 것이 낫지 않을까요?

미리 감사드립니다.

답변

2

나는 $choice에 대한 몇 가지 유효성 검사를 할 것 :

case $choice in 
    # Check for digits 
    +([0-9])) 
     lines=($(wc -l)) 
     if ((choice > 0 && choice <= lines)) 
     then 
      dtvariable=$(sed -n "$choice"p "$dumpfile") 
      $dtvariable   ;; 
     fi 
# etc. 
+1

감사합니다. Dennis. 나는 extglob 부분없이 갔고 그것은 환상적으로 테스트합니다. – Chasester

1

다음은 내가 작업해야하는 항목입니다. 주요 차이점은 확장 된 패턴 매칭 켜집니다 shopt -s extglob의 추가, 그리고 정규 표현식의 bash는 동일합니다 +([0-9]) 패턴은 [0-9]+

shopt -s extglob 
while [[ 1 ]] 
do 
    read -p "Please make a selection, select q to quit: " choice 
    case $choice in 
      # Check for digits 
    +([0-9])) 
     echo $choice ;; 
    q|Q) 
     break 
      ;; 
     *) 
      echo "Invalid choice" 
      ;; 
    esac 
done 
+0

예기치 않은 토큰'('+ ([0-9])에 의한 오류) 근처에 구문 오류가 발생했습니다. 여분의 공백이나 다른 것을 볼 수 없습니다. 여전히 쳐다보다. – Chasester

+0

extglob를 추가 했습니까? + (...) 구문은 extglob에 의해 활성화되어 있기 때문에이 옵션이 없으면 작동하지 않습니다. –