Bash에서 확장된 문자열을 확장할 때

5399 단어 Bashtech

Background


Bash를 사용할 때 어떤 글이 언제 펼쳐질지 모르고, 실제적으로 기대와 다르게 쓰면 다시 쓰는 등 여러 가지 일을 해왔다.각자의 전개 기능 자체에 대해 설명하지 않는다[1].
참조된 문서 (bash v5.0의 man)
  • https://manpages.debian.org/buster/bash/bash.1.en.html
  • Main Contents


    주요[2] 상하문은 다음과 같다.
  • unquoted
  • "double quoted"
  • 'single quoted'
  • $'single quoted with dollar' [3]
  • 주요[4] 문자열 확장
  • History Expansion(e.g. !! )
  • Parameter Expansion(e.g. ${VAR} )
  • Command Substitution(e.g. $(cmd) , `cmd` )
  • Arithmetic Expansion(e.g. $((1+1)) )
  • Brace Expansion(e.g. a{b,c}d , {1..5} )
  • Tilde Expansion(e.g. ~ )
  • Pathname Expansion(e.g. dir/* , /dev/video[0-3] )
  • Backslash-Escaped Characters [5] (e.g. \n )
  • 이 중 어느 것을 표에서 아래와 같이 펼칩니까?
    unquoted
    ""
    ' '
    $' '!!o
    o
    x
    x${VAR}o
    o
    x
    x$(cmd)o
    o
    x
    x$((1+1))o
    o
    x
    xa{b,c}do
    x
    x
    x~o
    x
    x
    xdir/*o
    x
    x
    x\nx
    x
    x
    o

    Supplements


    HERE DOCUMENTS


    다음 텍스트를 Here Documents라고 합니다.
    <<HERE
    text
    HERE
    
    전개$ 시스템 Expansion${VAR}, $(cmd), $((1+1))."double quoted"History Expansion 버전이 없습니다.
    또한 Here Docoments는 HERE 섹션에 single quote를 추가할 수도 있습니다.
    <<'HERE'
    text
    HERE
    
    이 경우 어떤 내용도 펼치지 않습니다("single quoted"와 같음).

    Backslash-Escaped Characters

    $' '에서 전개된 백스lash-escaped characters는 다음과 같다(man 인용)
    \a     alert (bell)
    \b     backspace
    \e
    \E     an escape character
    \f     form feed
    \n     new line
    \r     carriage return
    \t     horizontal tab
    \v     vertical tab
    \\     backslash
    \'     single quote
    \"     double quote
    \?     question mark
    \nnn   the eight-bit character whose value is the octal value nnn (one to three octal digits)
    \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
    \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
    \UHHHHHHHH
           the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)
    \cx    a control-x character
    
    echo -e도 백스lash-escaped characters를 펼칠 수 있다.그러나 처리할 수 있는 문자열은 미묘하게 다르다.다음은 man에서 인용한 것입니다.
    \a     alert (bell)
    \b     backspace
    \c     suppress further output
    \e
    \E     an escape character
    \f     form feed
    \n     new line
    \r     carriage return
    \t     horizontal tab
    \v     vertical tab
    \\     backslash
    \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
    \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
    \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
    \UHHHHHHHH
           the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)
    

    $" "

    printf와는 달리 $' '도 있다.일반$" " 외에도 " "와 같은 i18n의 문자열 교환 기능[6]을 사용할 수 있다.
    $ locale -a
    C
    C.UTF-8
    en_GB.utf8
    en_US.utf8
    ja_JP.utf8
    POSIX
    
    $ export TEXTDOMAIN=bash
    $ export LANG=en_US.UTF-8
    $ echo $"Done"
    Done
    $ gettext -s Done
    Done
    
    $ export LANG=ja_JP.UTF-8
    $ echo $"Done"
    終了
    $ gettext -s Done
    終了
    
    참조: https://www.linuxjournal.com/content/internationalizing-those-bash-scripts
    또한gettext 백스lash-escaped characters를 펼치지 않습니다.
    각주
    그런데 특히Parameter Expansion 같은 건 잘 알려지지 않았지만 편리한 기능이 많아서 셸 스크립트를 쓰는 분들에게 man↩︎을 추천합니다.
    독단과 편견↩︎
    정식 이름이 아니에요↩︎
    독단과 편견↩︎
    일반적인 전개라는 단어는 사용하지 않지만 총괄↩︎
    locale 설정 필요↩︎

    좋은 웹페이지 즐겨찾기