ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ๐Ÿ… Ch14 Advanced Shell Scripting ๐Ÿ…
    ๐Ÿฎ ํ•™๊ต ๊ณต๋ถ€/๐Ÿ… ์œ ๋‹‰์Šค ์‹œ์Šคํ…œ 2025. 5. 31. 20:38

    Input/output redirection (์ž…์ถœ๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜)

    ์„ธ ๊ฐ€์ง€ ํ‘œ์ค€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

    STDIN (0): ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ŠคํŠธ๋ฆผ

    STDOUT (1): ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ฐ˜ ์ถœ๋ ฅ(๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€ ๋“ฑ)์„ ๋ชจ๋‹ˆํ„ฐ(ํ„ฐ๋ฏธ๋„)์— ๋ณด๋‚ด๋Š” ์ŠคํŠธ๋ฆผ

    STDERR (2): ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ „์šฉ ์ŠคํŠธ๋ฆผ

    STDOUT/STDERR์„ ๊ตฌ๋ถ„ํ•˜๋ฉด ์ •์ƒ ์ถœ๋ ฅ, ์˜ค๋ฅ˜ ์ถœ๋ ฅ์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜๊ฑฐ๋‚˜ ํ„ฐ๋ฏธ๋„, ํŒŒ์ผ์„ ๋™์‹œ ํ™œ์šฉ ๊ฐ€๋Šฅ

    ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์—ฐ์‚ฐ์ž

    >: STDOUT->ํŒŒ์ผ (๋ฎ์–ด์“ฐ๊ธฐ)

    >>: STDOUT->ํŒŒ์ผ (์ด์–ด์“ฐ๊ธฐ)

    <: ํŒŒ์ผ->STDIN

    2>: STDERR->ํŒŒ์ผ (๋ฎ์–ด์“ฐ๊ธฐ)

    2>>: STDERR->ํŒŒ์ผ (์ด์–ด์“ฐ๊ธฐ)

    &>: STDOUT+STDERR->ํŒŒ์ผ (๋ฎ์–ด์“ฐ๊ธฐ, Bash ํ™•์žฅ)

    |: ํŒŒ์ดํ”„

    $ cat << AAA
    The Cat
    Sat on the
    Mat .
    AAA // end string
    $ find / -name "*.txt" > out.txt 2> err.txt # STDOUT(1)์„ out.txt๋กœ ๋ฎ์–ด์“ฐ๊ธฐ, STDERR(2)๋ฅผ err.txt๋กœ ๋ฎ์–ด์“ฐ๊ธฐ
    $ find / -name "*.txt" > out.txt 2>1& # out.txt๋กœ STDOUT์„ out.txt์— ๋ฎ์–ด์“ด ๋’ค, STDERR(2)๋ฅผ ํ˜„์žฌ์˜ STDOUT(1) ์œ„์น˜(=out.txt)๋กœ ๋ณต์‚ฌ
    $ find / -name "*.txt" 2> out.txt 1>2& # ๋จผ์ € STDERR๋ฅผ ํ„ฐ๋ฏธ๋„์˜ STDOUT(!)์œผ๋กœ ๋ณต์‚ฌํ•œ ๋’ค, STDOUT๋งŒ out.txt๋กœ ๋ณด๋ƒ„ -> STDERR์€ ์—ฌ์ „ํžˆ ํ„ฐ๋ฏธ๋„์—, STDOUT๋งŒ ํŒŒ์ผ์— ๊ธฐ๋ก๋จ
    # ๋งˆ์ง€๋ง‰์˜ &๋Š” ์ด ๋ช…๋ น์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•˜๋ผ๋Š” ๋œป

    Command Substitution (๋ช…๋ น ์น˜ํ™˜)

    ์‰˜ ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ๋‹ค๋ฅธ ๋ช…๋ น์˜ ์ถœ๋ ฅ์„ ๋ณ€์ˆ˜์— ๋‹ด๊ฑฐ๋‚˜, ๊ณง๋ฐ”๋กœ ๋‹ค์Œ ๋ช…๋ น์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค„ ๋–„ ์‚ฌ์šฉ

    - ๋ฐฑํ‹ฑ ๋ฐฉ์‹ (๊ตฌ ๋ฐฉ์‹)

    # ํŒŒ์ผ์˜ ์ค„ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ณ€์ˆ˜์— ์ €์žฅ
    Lines=`wc -l textfile`
    # ์‚ฌ์น™์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐ
    a=`expr $a + 1`

    - $() ๋ฐฉ์‹ (์‹  ๋ฐฉ์‹)

    Lines=$(wc -l textFile)
    a=$(expr $a + 1)

    Shell ๋ณ€์ˆ˜

    ์…ธ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์…ธ ์„ธ์…˜์—์„œ ๊ฐ’ ์ €์žฅํ•˜๊ณ  ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

    a=5

    export a

    export b=7

    echo $a

    set

    env

    set|grep PATH

    Shell Function

    name() {commands;}

    # 1) ํ•จ์ˆ˜ ์ •์˜
    repeat() {
      echo -n "I don't know $1 $2"
      return 7
    }
    
    # 2) ํ•จ์ˆ˜ ํ˜ธ์ถœ
    repeat Your Name
    
    # 3) ํ•จ์ˆ˜ ํ˜ธ์ถœ ์งํ›„์˜ ์ข…๋ฃŒ ์ƒํƒœ
    echo $?       
    
    # 4) ์Šคํฌ๋ฆฝํŠธ ์ „์ฒด ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ 0์œผ๋กœ ์ง€์ •
    exit 0
    
    # 5) (์‚ฌ์‹ค ์ด ๋ผ์ธ์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ด๋ฏธ exit ํ•ด์„œ ์‹คํ–‰๋˜์ง€ ์•Š์Œ)
    echo $?

    -> I don't know your Name

         7

         $ echo $?

         0

    scope

    scope - local, global

    #!/bin/bash
    
    # 1) ํ•จ์ˆ˜ ์ •์˜
    scope() {
      local lov=1      # โ‘  local ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ → ์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์œ ํšจ
      glov=2           # โ‘ก ํ‚ค์›Œ๋“œ ์—†์ด ์„ ์–ธํ•œ ๋ณ€์ˆ˜ → ๊ธ€๋กœ๋ฒŒ(ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์•„๋‹˜)๋กœ ์ทจ๊ธ‰
      echo "ํ•จ์ˆ˜ ๋‚ด๋ถ€: local=$lov, global=$glov"
    }
    
    # 2) ํ•จ์ˆ˜ ํ˜ธ์ถœ
    scope
    
    # 3) ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„ ์ „์—ญ ๋ณ€์ˆ˜ ํ™•์ธ
    echo "ํ•จ์ˆ˜ ์™ธ๋ถ€: local=$lov, global=$glov"

    local 1 global 2

    local  global 2

    Funcrion libraries

    include function script file using dot(.)

    ../scope.sh // file name is scope.sh
    scope // function call
    echo function call test ends.

    getopts

    a built-in command line parser

    ๋ช…๋ น์ค„ ์˜ต์…˜๊ณผ ์ธ์ž๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด์žฅ๋œ ๋„๊ตฌ

    while getopts "abc:d:e:f:" opt
    do
      case $opt in
            a) echo a specified;;
            b) echo b specified;;
            c) echo c specified
               echo $OPTARG;;
            d) echo d specified;;
            e) echo e specified;;
            f) echo f specified
               echo $OPTARG;;
      esac
    Done

    opt: ํ˜„์žฌ ์ฒ˜๋ฆฌ๋œ ์˜ต์…˜ ๋ฌธ์ž ๋‹ด๋Š” ๋ณ€์ˆ˜

    OPTARG: ์ธ์ž๋ฅผ ํ•„์š”๋กœ ํ•œ๋А ์˜ต์…˜์˜ ์ธ์ž ๊ฐ’์„ ๋‹ด๋Š” ๋ณ€์ˆ˜

    OPTIND: getopt๊ฐ€ ๋‹ค์Œ์— ์‚ดํŽด๋ณผ ์ธ์ž์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜

    $ sh getopts.sh -a -b -c cc -d -e -f ff

    $ sh getopts.sh -abc cc -def ff // same

    Signals and Traps

    trap '<๋ช…๋ น์–ด>' <์‹ ํ˜ธ๋ฒˆํ˜ธ>  // single quote, ignore ^c(SIGINT)

    trap: ์ง€์ •ํ•œ ์‹œ๊ทธ๋„์„ ์ˆ˜์‹ ํ–ˆ์„ ๋–„ <๋ช…๋ น์–ด>๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์คŒ/์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ ๋Œ€์‹  ์ด๋ฆ„(SIGINT, SIGTERM ๋“ฑ) ์‚ฌ์šฉ ๊ฐ€๋Šฅ

     

    trap '' 2 // SIGNIT(Ctrl+C) ์™„์ „ํžˆ ๋ฌด์‹œ
    
    while [1 = 1]
    do
    read a
    if [$a = 'a']
    then
        exit
    else
        echo you pressed $a
    fi
    done

    $ ./trap.sh

    ^c^c^c^cqyou pressed q

    File handling

    if [-w writefile || -x writefIle ]

    if [-r writeFile && -s writeFile ]

    -d: directory

    -e: file exist

    -r: readable

    -w: writable

    -x: executable

    -s: file size is greater than zero

    Array{bash}

    a[1]=2

    a2=(1 3 5 7 9 11)

    a3=([0]=1 [7]=2)

    b=`expr ${a[3]}+${a[5]}`

    ar={a2[@]} // ar=(1 3 5 7 9 11)

    alnth=${#a2[@]} // alnth=4

    ${ar[@]:3} : (7 9 11)

    ${ar[@]:3:2} : (7 9)

    ${!ar[@]} : (0 1 2 3 4 5) // ์ธ๋ฑ์Šค ๋ชฉ๋ก ์—ด๊ธฐ

    unset ar[@]; unset a[2] // ๋ฐฐ์—ด ์ž์ฒด ์ œ๊ฑฐ

Designed by Tistory.