DevOps/Shell

Shell Script - 5, Loop

게임이 더 좋아 2022. 11. 23. 23:54
반응형
728x170

이제 다양한 문자를 쓸 줄 알았으니

Loop와 같이 반복문을 알아보자

 

쉘 스크립트에서는 반복문도 사용할 수 있다.

C 언어에서의 for를 똑같이 쓴다.

다만 형식만 다르다.




for.sh

 
#!/bin/sh
for i in 1 2 3 4 5
do
  echo "Looping ... number $i"
done



결과는??

 

for2.sh

 
#!/bin/sh
for i in hello 1 * 2 goodbye
do
  echo "Looping ... i is set to $i"
done

 

결과는??

 



?? 2번째는 조금 이상하다.라고 느낄 수 있다.

하지만 argument 대로 정상적으로 들어왔다.

 

argument를 for 문에서 정상적으로 설정해야 의도한대로 된다는 것을 명심하자



그 다음은 while 반복문이다.



while.sh

 
#!/bin/sh
INPUT_STRING=hello
while [ "$INPUT_STRING" != "bye" ]
do
  echo "Please type something in (bye to quit)"
  read INPUT_STRING
  echo "You typed: $INPUT_STRING"
done



입력한 대로 출력해주는 쉘 스크립트로 bye 입력이 들어오기 전까지 반복한다.



while 문에서 유의할 것은 : (colon)은

조건문에 들어간다면 항상 true로 해석되므로 잘 써야 한다.

 

예를 들면

 

while2.sh

 
#!/bin/sh
while :
do
  echo "Please type something in (^C to quit)"
  read INPUT_STRING
  echo "You typed: $INPUT_STRING"
done

 

직접 인터럽트를 걸어줘야 break 될 수도 있다.

둘 다 괜찮게 쓰인다.




while문은 파일을 읽을 때도 유용하게 쓰인다.



while3.sh

 
#!/bin/sh
while read input_text
do
  case $input_text in
        hello)          echo English    ;;
        howdy)          echo American   ;;
        gday)           echo Australian ;;
        bonjour)        echo French     ;;
        "guten tag")    echo German     ;;
        *)              echo Unknown Language: $input_text
                ;;
  esac
done < myfile.txt



input_text를 계속 읽는 것이다.

다만 input_text의 조건은 \n (new line) 으로 끝나야 한다.

비어있는 라인이 있으면 절대 안된다.

 

다시 돌아와서 말하면

저 while 문은 1번 루프 돌 때 1개의 라인을 읽는다.

 

그 후에는 case 에서 input_text의 값을 감지한다.

만약 단어가 myfile.txt에서 읽혀서 hello라는 단어가 왔다면 해당 라인을 실행하게 되는 것이다.

또한 case 문의 default 같이 

모두 매칭되지 않을 때 실행하는 라인도 설정해 주어야 한다.

 

여기서 case 문을 끝낼 때는 case 문을 거꾸로한 esac을 써야 된다는 것을 잊지 말자.

 

728x90
반응형
그리드형

'DevOps > Shell' 카테고리의 다른 글

Shell Script - 7, Case  (0) 2022.11.24
Shell Script - 6, Test  (0) 2022.11.24
Shell Script - 4, escape character  (0) 2022.11.23
Shell Script - 3, Wildcard  (0) 2022.11.23
Shell script 11, Tip  (0) 2022.11.22