2017-12-29 15 views
-1

사용자가 목록 내에서 값을 선택할 때까지 루프를 작성하려고합니다 (0에서 9까지의 한 자리 숫자). 리스트 내에서 루프까지 선택

choice=999 
echo $choice 
until [[ $choice in 0 1 2 3 4 5 6 7 8 9 ]] 
do 
    read -p "How many would you like to add? " choice 
done 

는 상관없이 내가 뭘, 난 그냥 작동시킬 수 없습니다 :이 내가 sh 명령을 사용하여 우분투 16.04 쉘에서 실행하려고 내의 .sh 스크립트입니다.

sh test2.sh 
999 
test2.sh: 3: test2.sh: [[: not found 
How many would you like to add? f 
test2.sh: 3: test2.sh: [[: not found 
How many would you like to add? 2 
test2.sh: 3: test2.sh: [[: not found 
How many would you like to add? 3 
test2.sh: 3: test2.sh: [[: not found 
How many would you like to add? r 
test2.sh: 3: test2.sh: [[: not found 

내가 해봤 너무 많은 것들을 :

  • until을 방지하고 단지 단일 대괄호 [ condition ]를 사용 while
  • 를 사용하여 다음 테스트는 손에 당신에게 오류의 아이디어를 제공하기 위해, 또는 대괄호가 전혀 없습니다.
  • =~을 정규 표현식과 일치 시키려면 ^[0-9]

아무것도 작동하지 않습니다. 항상 같은 오류. 무슨 일이야? :(

답변

1

를 첫째로, 당신의 [[: not found 당신이 배쉬를 사용하지 않을 것을 제안 중 하나가와 함께 스크립트의 상단에 #!/bin/bash을 추가하거나 실행합니다.또는 표준 [을 사용하십시오.

어느 쪽이든, in과 같이 사용할 수 없습니다. 하나 개의 대안은 case 문을 사용하는 것입니다 :

while :; do 
    read -p "How many would you like to add? " choice 
    case $choice in 
    [0-9]) 
     break 
     ;; 
    esac 
done 

좋은 점에 대한 case 문은 그들이 당신 글로브 패턴을 사용할 수 있다는 것입니다, 그래서 9-0에서 [0-9] 일치하는 번호입니다.

당신이 결국 배쉬를 사용하여 계획하는 경우

, 당신은 또한이 같은 갈 수

#!/bin/bash 

until [[ $choice =~ ^[0-9]$ ]]; do 
    read -p "How many would you like to add? " choice 
done 

을 여기에, 정규 표현식은 0에서 9에 이후 자리를 일치시키는 데 사용된다.

+0

고마움, 나는 두 번째 방법을 시도하고 매력처럼 작동했습니다. – Alexander

+0

오신 것을 환영합니다. 귀하의 질문을 편집하여 원래 의도했던 것을 더 분명하게 보여 드리겠습니다. 동의하지 않으시면 다시 편집하십시오. –

0

[[: not found은 bash는 내장, 아니 쉬입니다. 당신은 당신의 그녀 - 뱅을 확인하고 sh#!/binb/bash하지 #!/bin/sh? 그리고 두 번째, bash scriptname.sh으로 실행 스크립트를이 아니라고 확신 할 수 있습니다.

그리고 마지막으로, 그런 스크립트를 다시 작성하려고 :

choice=999 
echo $choice 
while [[ "$(seq 0 9)" =~ "${choice}" ]] 
do 
    read -p "How many would you like to add? " choice 
    # ((choice++)) If choice=999, script will not read anything. 
    # If 0 <= choice <= 9, script will not never stopped. 
    # So, you should uncomment ((choice++)) to stop script running when choice become 
    # more than 9. 
done 
+1

그게 유일한 문제는 아니지만, 스크립트가'sh' (맨 위 줄 참조)로 실행되고있는 것처럼 보입니다. –

+0

@TomFenech는 그것을 놓쳤지만 sh는 bash에 대한 심볼릭 링크가 될 수 있습니다. 그래서, 'bash scriptname.sh'에서 스크립트를 먼저 실행하고, she-bang을 확인하십시오. 그 다음에는 구문을 수정 해 보겠습니다. –

+0

bash test2.sh test2.sh : 3 행 : 조건부 이진 연산자가 필요합니다. test2.sh : 3 행 :'in '근처에서 구문 오류가 발생했습니다. test2.sh : line 3 :'까지 [[0 1 2 3 4 5 6 7 8 9]에 $ choice] ' – Alexander