_변수_는 데이터를 담아 두는 곳이에요. Bash에는 문자열과 배열, 두 가지 종류의 데이터가 있어요. 배열은 나중에 다뤄요.
변수는 이렇게 할당해요.
name="value"
중요: 등호 앞뒤에는 공백이 없어야 해요!
아래 예시처럼 공백이 있으면,
x = 10
bash는 명령어 x를 두 개의 인자 =와 10과 함께 호출해요!
변수는 _매개변수_라고 부르기도 해요. 이 문서에서는 두 용어를 같은 뜻으로 사용해요.
bash가 사용하거나 설정하는 중요한 매개변수로는 이런 것들이 있어요:
PATH: 외부 명령어를 찾을 때 사용하는, 콜론으로 구분된 디렉터리 목록이에요.IFS: "내부 필드 구분자"예요.
아래에서 어떻게 쓰이는지 살펴봐요.PWD: 현재 작업 디렉터리예요.
pwd 명령어의 출력과 같은 값이에요.RANDOM: 0과 32767 사이의 의사 난수 정수예요.BASH_VERSION: 실행 중인 bash 인스턴스의 버전 문자열이에요.변수 이름은 _대문자, 소문자, 숫자, 밑줄_로 구성돼요. 숫자로 시작할 수는 없어요.
매개변수의 값은 $varname 문법으로 가져와요.
x=10
echo "The value of x is $x"
변수 이름이 주변 텍스트와 헷갈리지 않도록, 변수 이름을 중괄호로 감쌀 수 있어요.
예를 들어 문자열 10x10을 출력하려면
echo "${x}x$x"
# or
echo "${x}x${x}"
일부 스타일 가이드에서는 가독성이나 일관성을 위해 대부분의 경우 중괄호를 사용할 것을 권장해요.
명령어와 인자 강의에서 이야기했듯이, 명령어는 인자를 받을 수 있어요. Bash 스크립트도 예외가 아니에요. 현재 bash 인스턴스에 전달된 인자를 _위치 매개변수_라고 해요. 이들은 다음과 같은 특수 매개변수로 가져올 수 있어요:
$1: 첫 번째 위치 매개변수예요.$2 ... $9: 그다음 매개변수들이에요.${10} ...: 두 자리 수부터는 중괄호가 필요해요.$0: 현재 스크립트의 이름이에요.셸 함수에 전달하는 인자도 마찬가지로 위치 매개변수이고, 똑같은 방식으로 다뤄요. 함수에 대해서는 나중 강의에서 더 살펴봐요.
위치 매개변수를 다루는 데 도움이 되는 _특수 매개변수_도 있어요.
$#는 위치 매개변수의 _개수_로 확장돼요."$@"는 모든 위치 매개변수의 목록으로 확장되는데, 각각이 별도의 단어로 취급돼요."$*"는 모든 위치 매개변수를 하나의 문자로 이어 붙인 하나의 문자열로 확장돼요.
$IFS 변수의 _첫 번째 문자_이고, 기본값은 공백이에요."$@"는 위치 매개변수를 안전하게 인용한 채 다른 명령어에 전달하는 가장 안전한 방법이에요.
위치 매개변수를 순회할 때도 이걸 사용해요:
for arg in "$@"; do
do_something_with "$arg"
done
실제로는 "$*"보다 "$@"를 더 자주 사용해요.
bash 스크립트에서 아주 자주 하는 작업이 명령어의 출력을 붙잡아 변수에 저장하는 것이에요. 이럴 때 _명령어 치환_을 사용해요.
var=$(command)
예를 들어 문자열을 대문자로 바꾸려면 이렇게 해요:
text="Hello world!"
uppercase=$(echo "$text" | tr '[:lower:]' '[:upper:]')
echo "$uppercase"
# => HELLO WORLD!
Bash에는 변수와 문자열을 다루는 내장 기능이 많아서, 외부 명령어를 불러올 필요가 없어요.
텍스트를 대문자로 바꾸기.
앞 절에서 tr로 텍스트를 대문자로 바꾸는 방법을 보여줬어요.
bash에서 하려면 이렇게 해요:
echo "${text^^}"
마찬가지로 ${text,,}는 값을 소문자로 바꿔요.
변수가 비어 있을 때 기본값 제공하기.
default="nothing here"
result=""
echo "${result:-$default}"
# => nothing here
검색과 바꾸기.
text="Hello world!"
echo "${text//[aeiou]/X}"
# => HXllX wXrld!"
그 밖에도 흥미로운 매개변수 확장이 많아요: 부분 문자열 추출하기, 문자열 길이 구하기, 기본값 _할당_하기, 값의 앞이나 뒤에서 텍스트 제거하기 등등이요. 매뉴얼에서 자세히 읽어볼 수 있어요.