Shell Script 간단 주의점
파일명 : NUL, / 제외하고 모두 가능
command 에서 공백을 통해서 인수를 구분하게 됨
command arg1 arg2 arg3 ...
/ex
$ [10 -eq 10 ]; echo $? // 10: command not found
$ [ 10 -eq 10]; echo $? // bash: [: missing ']'
$ [ 10 -eq 10 ]; echo $? // <<< 이렇게 사용해야함
$ [ a=b ]; echo $? // 0
$ [ a = b ]; echo $? // 1 <<< 이렇게 사용해야함
대입연산은 명령 구조를 가지지 않음
# 변수 AA 가 명령이 되고 = , 10 는 각각 인수로 인식됩니다.
$ AA = 10
AA: command not found
# 그러므로 shell 에서 대입연산은 반드시 공백 없이 붙여 사용해야 합니다.
$ AA=10
$ echo $AA
10
shell script에서 0 = , 나머지 숫자 = 거짓
shell script 에서 return은 연산 결과 가 아닌 종료 상태 값을 지정함
개행을 자동 인식하여 명령 종료 문자인 ;는 필수가 아님 하지만 개행을 하지않고 한 줄로 사용할 경우 ;사용 해야함
# 명령들을 한줄에 연이어 쓸 경우는 ';' 를 붙여야 한다.
$ for i in {1..3} do echo $i done
> 오류
$ for i in {1..3}; do echo $i; done
1
2
3
shell 메타 문자는 특별 취급을 받아 공백, ;의 제약을 받지 않음.
( ) ` | & ;
&& || # AND, OR 문자
< > >> # redirection 문자
* ? [ ] # glob 문자
" ' # quote 문자
\ $
= += # 대입연산
# '(' 와 명령 사이에 공백을 두지 않아도 되고 ')' 앞에 ; 를 붙이지 않아도 된다.
$ (echo hello; echo world)
hello
world
Escape
- Shell 에서 사용되는 명령문에는 단지 명령문을 위한 스트링만 존재하지 않습니다. script 작성을 위해 shell 에서 제공하는 키워드, 메타문자, glob 문자들이 같이 사용되는 환경이기 때문에 만약에 명령문에서 동일한 문자가 사용된다면 escape 하거나 quote 하여 명령문을 위한 스트링으로 만들어 줘야 오류가 발생하지 않습니다.
# 명령문에 shell 에서 사용하는 glob 문자 '*' 가 포함되어 에러 발생
$ expr 3 * 4
expr: syntax error
# 다음과 같이 escape 하거나 quote 하여 명령문을 위한 스트링으로 만들어줌
$ expr 3 \* 4
$ expr 3 '*' 4
12
변수나 명령치환을 quote 하지 않으면 값이 출력될때 IFS ( Internal Field Separator : 기본적으로 공백문자로 구성 ) 에의해 단어가 분리
- 뜻하지 않게 인수가 2개 이상으로 늘어난다거나 공백이 포함된 파일이름이 분리가 되는 오류가 발생할 수 있습니다.
Shell 에서는 파일을 select 할때 glob 문자를 ( *,?,[ ] ) 이용합니다. 그러므로 변수나 명령치환을 quote 하지 않고 사용할 경우 출력되는 값에 glob 문자가 포함되면 뜻하지 않게 globbing 이 발생해 오류가 발생할 수 있습니다.
$ AA="User-Agent: *" # 변수 AA 값으로 glob 문자 '*' 가 사용됨
$ echo "$AA" # quote 을 하면 globbing 이 발생하지 않음
User-Agent: *
$ echo $AA # quote 을 하지 않아 globbing 이 발생해 뜻하지 않은 값이 출력됨
User-Agent: 2013-03-19 154412.csv Address.java address.ser
ReadObject.class ReadObject.java robots.txt 쉘 스크립트 테스팅.txt
WriteObject.class WriteObject.java
cd 명령은 종료 상태 값을 확인해야 한다.
# cd 명령 실패시 현 디렉토리 모두 삭제됨
cd ~/tempdir
rm -rf *
# 이동이 실패시 삭제 명령이 실행되지 않음
cd ~/tempdir && rm -rf *
child 프로세스에서도 변수를 사용하려면 export 해야 합니다.
설정한 변수값은 subshell 프로세스에서는 그대로 사용할 수 있지만 스크립트 파일을 실행할 때와 같이 exec 에 의해 생성되는 프로세스에서는 사용할 수 없습니다. 이때는 변수를 export 해야 사용할 수 있습니다.