티스토리 뷰
처음 shell programming 관련 글에서 if 를 만났을 때, 당황스러웠습니다.
if 가 사용되는 기본형을 봅시다.
if [ expression ]
then
...
fi
그 글에서 if 와 [ 사이에 공백이 필요하고 [ 와 expression 사이에도 공백이 필요하다고 강조를 하더군요.
공백이 왜 필요하지?
if 다음에 ( 가 따라와야 하는 C/C++ 혹은 Java 등과 비교해보면 이상합니다.
그 언어들에서 if 와 ( 사이, ( 와 expression 사이에 공백을 요구하지 않았거든요.
그래서 이유를 알아 보았습니다.
다른 프로그래밍 언어에서는 if 는 뒤에 논리식(logical expression)이 따라 옵니다.
하지만 bash 는 사정이 다릅니다.
if command #command 위치에는 function 이 올 수도 있다.
then
...
fi
if 와 then 사이에는 exit code 나 return value 를 생산하는 것이 옵니다.
즉,
if 다음에는 논리식이 아니라 명령어나 함수가 와야 합니다.
응? 그렇다면 if 뒤에서 자주 보게되는 [ 는 정체가 ? 설마 명령어(command) ?
그랬습니다! which 로 확인한 [ 의 정체는 built-in command 였습니다.
[ 는 test 명령어와 같은 기능을 합니다.
( 끝에 ] 가 필요하다는 점만 다릅니다. 예전에는 [ 가 'test' command 의 link 였던 적도 있었던 모양입니다.)
[ 가 독립된 명령어란 사실을 알게되자 공백과 관련된 의문은 모두 사라졌습니다. [ 대신 test 를 생각하면 더 쉽게 이해됩니다
iftest 는 아무래도 이상하죠? if test 가 정상으로 보입니다.
또한 test 뒤에 공백이 없으면 명령어에 인자를 붙여 쓴 꼴이므로 문제가 발생하겠죠.(이 시리즈의 첫글의 내용도 공백관련이었습니다.)
다른 언어와 다르게 if 뒤에 명령어나 함수가 온다면 분기 판단은 어떻게 하는 걸까요?
if 와 then 사이의 명령어의 exit code 나 함수의 return value 가 0 일 때, then 다음의 명령어들이 실행됩니다.
위의 script 를 실행하면 다음의 결과를 얻습니다.
return value 가 0 일 때, 참으로 평가받다니!
exit code 나 return value 가 0 일 때, 명령어나 함수가 정상 종료를 의미해서 그런 거겠지만 상당히 헷갈리네요.
'Programming Language > Shell Programming' 카테고리의 다른 글
Bash Scripting 06 - 문자열 (0) | 2022.07.20 |
---|---|
Bash Scripting 05 - 변수확장 (3) (0) | 2022.07.20 |
Bash Scripting 04 - 변수확장(2) (0) | 2022.07.14 |
Bash Scripting 03 - Globbing (0) | 2022.07.11 |
Bash Scripting 02 - 변수확장(1) (0) | 2022.07.09 |
- Total
- Today
- Yesterday
- 정수론
- 백준
- persistent segment tree
- 다익스트라
- Dijkstra
- dynamic programming
- Vim
- RUBY
- math font
- JavaScript
- bash
- map
- python3
- 세그먼트 트리
- nearest common ancestor
- number theory
- shell
- max flow
- BOJ
- Shell Programming
- javascript array
- fenwick tree
- Reference
- script
- stack
- lazy propagation
- C++ big number
- bash script
- Aho-Corasick
- segment tree
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |