저번에 seq 명령어에 대해서 이야기 한 적이 있었습니다. 이것을 이야기 하면서, 쉘 프로그래밍에서 꽤나 유용하게 쓰일 법 하다고 언급을 했는데요. 예제를 통해서 알아보도록 하겠습니다.

 

[관련글]

쉘 스크립트에서 $()과 $의 차이점이 뭔가요?

seq 명령어에 대해 알아봅시다.

 


 먼저, 1 row, 2 row, ... , 10 row를 출력해야 한다고 생각해 보겠습니다. 그럴 때 어떻게 하면 좋을까요?

 

 단지, for in 문을 곁들이면 됩니다. 1부터 10까지 도는 것은 $(seq 10)에서 처리합니다. 이 글을 보시면, $()는 명령어의 실행 결과로 대치된다고 설명이 되어 있어요. 예를 들자면 $(seq 10)은 단지 1 2 3 4 5 6 7 8 9 10으로 대치될 뿐입니다. 그래서, 사실 이 쉘 프로그램은, 아래와 같다고 볼 수 있습니다.

 

 

 정확하게 이것과 같습니다. 이것은 loop를 돌 때 마다 i의 값이 1, 2, 3, 4, 5, 6, 7, 8, 9, 10이 됩니다. 다음에, 3번째 줄을 보시면 echo $i row가 있는데요. echo는 단지 텍스트를 보여주는 명령입니다.

 

 

 그러면 echo $i row는 $i row가 화면에 출력된다는 건데요. 문제는 $i입니다. 이것은 변수의 값이 대치된다는 의미입니다. 예를 들어 i의 값이 1일 때, echo $i row는 echo 1 row로 대체된다는 의미입니다. 즉, 이 프로그램은 i 값이 1부터 10까지 변하므로, 3번째 줄을 for loop마다 계속 수행한다면 1 row, 2 row, ... , 10 row가 출력됩니다.

 


 정말 그런지 실행시켜 봅시다.

 

 lp.sh의 권한을 보면, x가 없는 게 보이실 겁니다. 이는 실행 권한이 없는 것을 의미합니다. chmod 744를 하면, 파일의 소유자가 쉘 파일인 lp.sh를 실행 시킬 수 있어요. 권한이 rwxr--r--이 되기 때문이에요.

 

 

 실행을 시켜 보니, 1 row부터 10 row까지 출력되었음을 알 수 있어요. 제가 문제를 제작할 때, 여러 테스트 케이스를 제너레이션 하고, 테케를 통해서 정답 파일을 제너레이션 하는 작업을 수행하는데요. 일일히 명령어로 치면 귀찮을 거에요. 예제 몇 개 더 보겠습니다. 1부터 10까지 수 중에서 홀수만 오름차순으로 출력하려고 해요. 어떻게 하면 될까요?

 

 

 간단해요. 단지, for in에 들어가는 seq 명령어를 seq 1 2 10으로 바꾸면 됩니다.

 

 

 1 row, 3 row, 5 row, 7 row, 9 row가 차례대로 출력되었네요. 다음에 11.txt, 12.txt, ... , 15.txt에 각각 11, 12, 13, 14, 15라는 내용을 저장하고 싶어요. 만약에 있다면, 내용을 다 지우고 11, 12, 13, 14, 15를 저장할 거에요. 이건 어떻게 하면 좋을까요?

 

 

 redirect를 할 때 >>는 append를 의미해요. 우리는 11, 12, 13, 14, 15라는 내용으로 덮어쓸 것이니, >>는 맞지 않습니다. >를 쓰시면 됩니다. echo $i의 결과를 $i.txt에 쓰겠다는 의미입니다. i의 값은 11부터 15까지 변하니, echo 11 > 11.txt부터 echo 15 > 15.txt까지 수행됩니다.

 

 

 잘 들어갔는지 확인해 봅시다. ls -ail를 쳐 보면 11.txt부터 15.txt까지 모두 들어가 있음을 알 수 있어요.

 

 

 11, 12, 13, 14, 15가 잘 들어갔음을 확인할 수 있어요.