이 글 시리즈는 위 링크를 참조
기본 전제
$(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:
- The speed at which an interpreted program will run as compared to a C program, or even an interpreted Perl program.
- Since it is easy to write a simple batch-job type shell script, there are a lot of poor quality shell scripts around.
쉘 스크립트가 유닉스 관리자가 꺼리는 몇 가지 이유가 있는데
- C 나 Perl 에 비해 느림
- 오히려 작성하기 쉬워서 저급한 스크립트가 많다.
쉘 스크립트를 잘 작성하기 위해서는 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를 나누는 기준인 것도 알았고
따옴표가 묶는 것도 알았고
` 기호와 ‘ 기호 “ 기호가 각각 다른 것도 알았다.
'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 |