ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 셸스크립트 - $, if, case, [, test
    Linux 2022. 12. 24. 01:43

    $, if, case, [, test의 사용법에 대해 알아본다.


    0. #!/bin/sh 와 #!/bin/bash의 차이

     

    #!/bin/bash : bash 을 사용하겠다.

    #!/bin/sh : /bin/sh에 링크된 쉘을 사용하겠다. 즉 심볼릭 링크 파일이다.

    심볼릭 링크는 링크를 연결하여 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크를 뜻한다.

     

    즉 여러 환경의 셸에서 동일한 셸을 쓰려면 #!/bin/bash 와 같이 명시하는 것이 좋다.

     

    1. $

    #!/bin/bash
    
    a=str
    b=ing
    
    echo $a
    echo $b
    echo ${a}ABC${b}
    
    c=${a}${b}
    echo $c
    
    
    
    --- 실행 화면 ---
    str
    ing
    strABCing
    string

    = 의 좌우에는 공백이 있으면 안 된다.

    변수명을 사용하려면 $, 문자열과 혼용하여 사용하려면 { } 으로 감싼다.

     

    #!/bin/bash
    
    echo 1st argument is $1
    echo 2nd argument is $2
    echo The number of arguments is $#
    
    shift
    echo 1st argumnet is $1
    
    --- 실행 화면 --- 
    1st argument is hello
    2nd argument is world
    The number of arguments is 2
    1st argumnet is world

    파일 실행 시에 첫 번째 인수로 hello, 두 번째 인수로 world를 주었을 때 위와 같이 실행된다.

    shift 명령어를 사용하면 $2는 $1이 되고 $3은 $2가 되며 인수가 하나씩 당겨진다. 

    while 문에서 인수를 당기며 $1을 계속 사용하는 방법이 일반적이다.

     

    1.1 주요 특수 변수

    $0 : 셸 스크립트 명

    $n : n번째 인수

    $* : 모든 인수 목록

    $# : 인수 개수

    $? : 직전에 실행한 명령어 상태 (반환 값)

    $$ : 셸 스크립트 PID

    $LINENO : 변수를 사용한 줄 번호

     

     

    2. if

    if else 는 리눅스에서 다음과 같이 사용한다.

    #!/bin/bash
    
    if [ $1 = hello ]
    then
    	echo Argument is hello
    elif [ $1 = world ]
    then
    	echo Argument is world
    else
    	echo No matching
    fi

    조건 판정식은 [ ] 으로 감싼다. [ 는 명령어이고 ] 는 명령어 인수이므로 

    [ ] 의 좌우에는 한 칸 이상의 공백이 필요하다.

    조건 판정 이후 참이면 then 이후 처리를 실행하고 if 문은 fi 로 끝난다.

     

    3. case

    if else 문을 case 문으로도 작성할 수 있다.

    #!/bin/bash
    
    case $1 in 
    	hello) 
        	echo Argument is hello
        ;;
        world)
        	echo Argument is world
        ;;
        *)
        	echo No matching
        ;;
    esac

    조건에는 문자열, 숫자, 정규식 패턴이 올 수 있다. 마지막 패턴을 *로 지정하여 일치하는 패턴이 없을 때 실행한다.

    각 분기의 끝에는 ;; 를 붙여 분기의 끝을 구분한다.

    case문은 esac 으로 끝난다.

     

    4. test

    조건 판정을 [ ] 뿐만 아니라 test 명령어로도 가능하다.

     

    #!/bin/bash
    
    if test -f $1; then
    	echo File $1 exists.
    fi

    test는 문자열 판정 외에도 파일 존재여부, 숫자 크고 작음 여부 판정에도 사용한다.

    명령어 끝에 줄 바꿈 대신 ; 을 사용할 수도 있다.

    ; 다음에는 공백문자가 필요하다.

     

    5.  [ 식 ] , test 식

    조건 판정에 자주 사용하는 식으로 다음이 있다.

     

    문자열

    -n string : string 문자열 길이가 0이 아니면 참.

    -z string : string 문자열 길이가 0이면 참

    str1 = str2 : str1 문자열과 str2 문자열이 동일하면 참.

    str1 != str2 : str1 문자열과 str2 문자열이 다르면 참.

     

    숫자

    n1 -eq n2 : 정수 n1과 정수 n2가 같으면 참.

    n1 -ne n2 : 정수 n1과 정수 n2가 다르면 참.

    n1 -gt n2 : 정수 n1이 정수 n2보다 크면 참.

    n1 -ge n2 : 정수 n1이 정수 n2보다 크거나 같으면 참.

    n1 -lt n2 : 정수 n1이 정수 n2보다 작으면 참.

    n1 -le n2 : 정수 n1이 정수 n2보다 작거나 같으면 참.

     

    파일

    -b file : file 파일이 존재하고 블럭 디바이스 파일이면 참. 

    -s file : file 파일이 존재하고 파일 크기가 0이 아니면 참.

    -S file : file 파일이 존재하고 소켓 파일이면 참.

    -f file : file 파일이 존재하고 일반 파일이면 참.

    -c file : file 파일이 존재하고 특수 디바이스 파일이면 참.

    -e file : file 파일이 존재하면 (종류를 가리지 않고) 참.

    -d file : file 파일이 존재하고 디렉터리이면 참.

    -L file : file 파일이 존재하고 심볼릭 링크이면 참.

    -r file : file 파일이 존재하고 읽기 가능하면 참.

    -w file : file 파일이 존재하고 쓰기 가능하면 참.

    -x file : file 파일이 존재하고 실행 가능하면 참.

    file1 -nt file2 : file1 파일이 file2 보다 새로우면 참.

    file1 -ot file2 : file1 파일이 file2 보다 오래됐으면 참.

     

    복합식

    expr1 -a expr2 : expr1 식과 expr2 식의 AND(&&)를 취함.

    expr1 -o expr2 : expr1 식과 expr2 식의 OR (||) 를 취함.

    !expr : expr 식을 반전시킴.

    (expr) : 괄호 안의 expr 식 결과를 돌려줌. 여러식을 결합할 때 사용. ()는 back slach로 이스케이프 하거나 ''으로 감싸야함.

     

     

     

     

     

    'Linux' 카테고리의 다른 글

    셸스크립트 - 함수, bc, sed, awk  (0) 2022.12.25
    셸스크립트- for, seq, while, expr, getopts  (0) 2022.12.24
    echo, unset  (0) 2022.12.24
    xargs, ;  (0) 2022.12.22
    <, >, >>, >&, |, |&, tee (리다이렉션, 파이프)  (0) 2022.12.22
Designed by Tistory.