IT/Unix & Linux

리눅스 쉘 스크립트 if 조건 [],[[]],(()),() 에 대한 차이 분석

지상낙원 2021. 4. 7. 17:04

  쉘 스크립트는 서버에서 자동화 작업시 주로 사용하게 됩니다. 서버의 자동화 작업은 새로운 서비스 추가가 아니라면 자주 하는 작업이 아닙니다. 그러다 보니, 쉘 스크립트의 문법을 잘 기억하지 못 합니다. 물론 개인차가 있겠지만, 인간의 기억 패턴이라는 것이 캐쉬와 비슷하여 최근에 자주사용한 것을 잘 기억하게 됩니다.

  아무튼 쉘 스크립트 프로그래밍을 하면서 if문 작성할 때, 조건정의를 할 때 마다 혼란스러워서 검색을 하였지만 한글로 된 자료는 못찾았습니다. 제가 검색실력이 부족한 것일 수도 있겠지만, 대부분 if구문에 대한 문법에 대한 이야기만 나와서 결국 영어로 된 좋은 자료를 찾았습니다.

unix.stackexchange.com/questions/306111/what-is-the-difference-between-the-bash-operators-vs-vs-vs)

 

What is the difference between the Bash operators [[ vs [ vs ( vs ((?

I am a little bit confused on what do these operators do differently when used in bash (brackets, double brackets, parenthesis and double parenthesis). [[ , [ , ( , (( I have seen people use them...

unix.stackexchange.com

다음 내용은 필요한 내용을 뽑아서 제가 나름대로 정리하였습니다.
부디 필요한 분에게 도움이 되기를 바랄께요.



Bourne과 같은 쉘의 if 문법은 다음과 같습니다.

if
command-list1
then
command-list2
else
command-list3
fi

 

command-list1의 exit code가 0이면 command-list2가 실행
command-list1의 exit code가 0이외 다른값(1~255)이면 command-list3가 실행

그런데 command-list1는 다음과 같이 여러형태로 작성할 수 있습니다.

1. if [ condition ]
   - [ ] 구문은 test 명령어 도구
   - POSIX 유틸리티 표준
   - exit code를 세팅
   - 파일이 존재여부나, 숫자의 비교 가능

(실습 환경 : 링크 에서 "Welcome to CoCalc!" 클릭하고, 다음 화면에서 Name 아래 "Welcome to CoCalc.term" 클릭)
echo $?           # exit code 값을 확인할 수 있는 명령어
test condition    # 참이면 0을, 거짓이면 1~255사이의 값을 exit code로 반환

(실습1-1)

test 1 == 1
echo $?           # 0출력

 

(실습1-2)

test 1 == 2
echo $?           # 1출력

 

(실습1-3)

test -f tempfile  #  tempfile 파일 존재 여부 체크
echo $?           # 1출력 

 

(실습1-4)

touch tempfile
test -f tempfile
echo $?           # 0출력



2. if [[ condition ]]
   - test의 업그레이드 버전(ksh에서 만들어 졌으나, bash, zsh, yash, busybox sh에서 지원함)
   - 1번과 큰 차이는 <, >, &&, ||, ()과 연산자에 대하여 논리연산자로 해석을 하게됨
   - 1번의 경우 <, >을 리다이렉션으로 해석
   - 1번의 경우 &&와 ||을 여러명령어를 여러개로 실행하는 것으로 해석

(실습2-1)

# && 를 이용하여 조건에 따라 여러 명령어 실행하기 
test 1 = 1 && echo "TEST"   # TEST 출력 
test 1 = 0 && echo "TEST"   # TEST 출력 안함

    - (실습 2-1)에서 &&는 논리 연산자 AND가 아니며, 명령어를 조건에 따라 실행시킬 수 있는 연산자임
    - [ "A" < "B" ]  # < 이 리다이렉션으로 해석되어 에러 발생되며, [ "A" \< "B" ] 로 하면 정상 실행
    - [ "A" = "A" && "B" = "B" ] # 에러 발생되며, [[ "A" = "A" && "B" = "B" ]] 로 하면 정상 실행



3. if (( condition ))
   - ksh 확장버젼으로 bash, zsh 지원
   - 산술 테스트(계산 또는 괄호를 사용하여 연산 우선순위 변경) 를 할 때 의미 있음

(실습3-1)

(( 1 + 4 == 5 ))
echo $?           # 0출력

(실습3-2)

(( 1 + 4 == 6 ))
echo $?           # 1출력



4. if ( command )
   - 명령어의 성공여부에 따라 조건 분기하고자 할 때 사용함
   - 명령어의 사용으로 인한 부작용(쉘의 환경 변수 변화)를 막기 위해서임
   - 이렇게 하면, 서브쉘에서 실행되므로 쉘 환경에 영향을 주지 않음

(실습4-1)

if (cd /tmp); then :; fi; pwd;      # tmp로 이동하지 않고 처리



5. if command
   - 4번과 같이 명령어의 성공여부에 따라 조건 분기하고자 할 때 사용하는 용도는 같음
   - 별도의 서브쉘 없이 실행되므로 쉘 환경에 영향을 주게 됨
   
(실습5-1)

if cd /tmp; then :; fi; pwd;        # tmp로 이동하여 처리
                                    # 이 명령어를 실행하기 전에 /tmp가 아닌 다른 폴더에서 실행해야 확인 가능