DevOps/Shell

Shell Script - 1, 작성하기

게임이 더 좋아 2022. 11. 21. 22:38
반응형
728x170

https://www.shellscript.sh/

이 글 시리즈는 위 링크를 참조

 


 

기본 전제

$(Dollar Sign) : 현재 Command Line 환경에서 작동하고 있다는 뜻

**변수를 사용할 때도 $를 쓴다.

 

EX)

 
$ echo '#!/bin/sh' > my-script.sh
$ echo 'echo Hello World' >> my-script.sh
$ chmod 755 my-script.sh
$ ./my-script.sh
Hello World



위 명령들은

표준 입력을 my-script.sh 파일로 만들고

이어서 표준 입력을 파일에 추가하고

권한을 바꾸고

sh파일을 실행한 것이다.

 

my-script.sh를 열어보면

 

아래와 같이 저장되어 있다.

 

 
#!/bin/sh
echo Hello World



sh 파일을 실행하기 위해서는 execuatable한 파일로 만들어야 하는데

파일의 읽기/쓰기/실행 권한을 바꿈으로써 가능하다.

 

 
$ chmod a+rx my-script.sh
$ ./my-script.sh



 

 

Shell script programming has a bit of a bad press amongst some Unix systems administrators. This is normally because of one of two things:

  1. The speed at which an interpreted program will run as compared to a C program, or even an interpreted Perl program.
  2. Since it is easy to write a simple batch-job type shell script, there are a lot of poor quality shell scripts around.



쉘 스크립트가 유닉스 관리자가 꺼리는 몇 가지 이유가 있는데

  1. C 나 Perl 에 비해 느림
  2. 오히려 작성하기 쉬워서 저급한 스크립트가 많다.



쉘 스크립트를 잘 작성하기 위해서는 2가지가 필수적으로 고려되어야 한다.

  1. 읽기 쉬운 레이아웃
  2. 불필요한 명령 삭제



아래의 2개의 예제 중 위에 것이 더 빠르게 작동한다.

 

$ cat /tmp/myfile | grep "mystring"



$ grep "mystring" /tmp/myfile



OS의 동작 차이 때문인데

grep을 실행하기 위해서 /bin/grep 에서 75600바이트인 pipe를 열고 메모리에 전송한다.

그리고 load 하고 run하는 작업을 한다.

반면에 /bin/cat 에서는 더 작은 9528 바이트 파일 자체를 입력하고  Load 하고 작업한다.



그렇다고 항상 위에 것처럼 작성하라는 것은 아니다.

이러한 명령이 loop와 같은 작업에서 일어난다면 오히려 메모리에 보내는 것이 더 효율적일 수 있기 때문이다.

 

하지만 그것 또한 항상 맞는 것도 아니다. 




—-------------------------------------------------------------------------




first.sh

 
#!/bin/sh
# This is a comment!
echo Hello World        # This is a comment, too!

 

첫 번째 줄은 /bin/sh로 실행된다고 선언하는 것이다.

(위치는 시스템마다 다를 수도 있음)

모든 쉘 스크립트는 첫번째 줄에 저렇게 정의된다.

두 번째 줄은 ‘#’으로 주석처리를 하는 기호를 보여준다.

 

이게 주석이라면 왜 첫 번째 줄은 주석이 되지 않는지 궁금할 것이다.

“#!” 이라는 유일한 예외가 존재하기 때문이다.

 

** 비슷하게 Perl 에서도 #!/usr/bin/perl 과 같이 쓴다.

 

세 번째 줄은 echo로 뒤의 입력을 반복한다.

parameter는 space로 구분된다.

 

이 쉘 스크립트를 실행하기 위해선 executable로 만들어야 한다.

 

아래와 같이 함으로써 실행할 수 있다.

 

$ chmod 755 first.sh

 

 
$ chmod 755 first.sh
$ ./first.sh
Hello World








만약 echo를 실행하는 부분에 space를 더 추가하면 어떻게 될까??

 
#!/bin/sh
# This is a comment!
echo "Hello      World"       # This is a comment, too!



여전히 실행된다.

그렇다면 왜 실행되는가? 를 알아야 한다.

 

사실 에코는 하나의 argument만 입력받았다.

 

shell에서는 argument들을 프로그램에 argument를 전달하기 전에 parsing을 하기 때문이다.

 

그렇기 때문에 따옴표를 제거해야만 하나의 argument로 전달된다.



그렇다면 아래와 같이 바꾸면 어떻게 될까??




first2.sh

 
#!/bin/sh
# This is a comment!
echo "Hello      World"       # This is a comment, too!
echo "Hello World"
echo "Hello * World"
echo Hello * World
echo Hello      World
echo "Hello" World
echo Hello "     " World
echo "Hello "*" World"
echo `hello` world
echo 'hello' world



순서대로 이렇게 나온다.

 

1,2,3 라인은 예상했을 것이다.

4라인은 3개의 argument가 들어왔다.

5,6 라인은 2개의 argument가 들어왔다.

7,8은 3개

9는 `라는 다른 기호가 들어가서 작동하지 않았다.

10은 또 그냥 기호가 들어가서 작동했다.

 

여기서 space가 argument를 나누는 기준인 것도 알았고

따옴표가 묶는 것도 알았고

` 기호와 ‘ 기호 “ 기호가 각각 다른 것도 알았다.

 

728x90
반응형
그리드형

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

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
Shell Script - 2, Variable(1)  (0) 2022.11.21
Shell Script, 셸 스크립팅하기  (2) 2022.09.05