backend/ubuntu

The linux command line - 34. string and numbers

seul chan 2021. 7. 18. 15:37

34. Strings and numbers

33장에서는 파일 수준의 데이터를 처리하는데 중점을 두었지만, 많은 프로그래밍 문제는 작은 데이터 단위를 사용해서 해결하는 경우들이 많음.

이번 챕터에서는 문자열과 숫자를 조작하는데 사용되는 쉘 기능을 다룸.

Parameter expansion

이전 장에서 이미 쉘 변수와 같은 몇몇 parameter expansion을 다뤄보았다. 쉘은 훨씬 많은 기능을 제공함.

특별한 이유가 없지 않으면 parameter expansion을 큰따옴표로 묶는것이 좋음.

Basic parameters

가장 단순한 형태는 일반적인 변수 형태. 중괄호로 묶을수도 있음.

$a
${a}

중괄호는 큰 영향을 미치니 않지만 다른 텍스트와 인접한 경우 사용됨.

a="foo"
echo "$a_file"
echo "${a}_file"

또한 9보다 큰 positional parameter는 중괄호로 숫자를 둘러쌀 수 있음.

# 11번째 위치 매개변수 사용
${11}

Expansions to manage empty variables

변수가 없거나 비어있는 경우에 처리하기 위한 parameter expansion

:-는 변수할당은 하지 않고 해당 변수가 없을 경우 default로 사용되는 값을 지정.

${parameter:-word}

간단한 예시는 다음과 같다.

[me@linuxbox ~]$ foo=
[me@linuxbox ~]$ echo ${foo:-"substitute value if unset"}
substitute value if unset
[me@linuxbox ~]$ echo $foo

[me@linuxbox ~]$ foo=bar
[me@linuxbox ~]$ echo ${foo:-"substitute value if unset"}
bar
[me@linuxbox ~]$ echo $foo
bar

:=는 parameter가 비어있으면 default 변수를 할당한다.

${parameter:=word}
[me@linuxbox ~]$ foo=
[me@linuxbox ~]$ echo ${foo:="default value if unset"}
default value if unset
[me@linuxbox ~]$ echo $foo
default value if unset
[me@linuxbox ~]$ foo=bar
[me@linuxbox ~]$ echo ${foo:="default value if unset"}
bar
[me@linuxbox ~]$ echo $foo
bar

${parameter:?word}는 word를 표준 오류로 전송하고 exit code를 설정. 변수가 없을 때 에러처리를 할 때 유용할 듯 하다.

[me@linuxbox ~]$ foo=
[me@linuxbox ~]$ echo ${foo:?"parameter is empty"}
bash: foo: parameter is empty
[me@linuxbox ~]$ echo $?
1
[me@linuxbox ~]$ foo=bar
[me@linuxbox ~]$ echo ${foo:?"parameter is empty"}
bar
[me@linuxbox ~]$ echo $?
0

${parameter:+word}는 parameter가 비어있으면 아무 결과도 없고, 파라미터가 있을 경우에만 word로 사용된다.

[me@linuxbox ~]$ foo=
[me@linuxbox ~]$ echo ${foo:+"substitute value if set"}

[me@linuxbox ~]$ foo=bar
[me@linuxbox ~]$ echo ${foo:+"substitute value if set"}
substitute value if set

Expansions that return variable names

${!prefix*}
${!prefix@}

위 표현식은 prefix로 시작하는 변수명들을 반환해준다.

[me@linuxbox ~]$ echo ${!BASH*}
BASH BASH_ARGC BASH_ARGV BASH_COMMAND BASH_COMPLETION BASH_COMPLETION_DIR
BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION

String Operations

string을 다루는 경우 쉘에서는 여러가지 expansion들을 제공한다.

${#paramater}는 파라미터의 length를 반환.

[me@linuxbox ~]$ foo="This string is long."
[me@linuxbox ~]$ echo "'$foo' is ${#foo} characters long."
'This string is long.' is 20 characters long.

${parameter:offset:length}는 string slicing을 해줌. 일반적인 프로그래밍 언어의 슬라이싱과 비슷함.

[me@linuxbox ~]$ foo="This string is long."
[me@linuxbox ~]$ echo ${foo:5}
string is long.
[me@linuxbox ~]$ echo ${foo:5:6}
string

그 외 다양한 패턴들이 존재.

${parameter#pattern}
${parameter##pattern}

${parameter%pattern}
${parameter%%pattern}

${parameter/pattern/string}
${parameter//pattern/string}
${parameter/#pattern/string}
${parameter/%pattern/string}