iBetter Books
수정

변수 선언과 사용

Bash 변수는 선언 키워드가 없습니다. 그냥 이름을 쓰고 =으로 값을 할당하면 됩니다. 단, 몇 가지 규칙을 지키지 않으면 예상과 다른 결과가 나옵니다.

변수 할당: = 앞뒤 공백 금지

name="ibetter"       # 올바름age=25               # 올바름name = "ibetter"     # 오류! = 앞뒤에 공백이 있으면 명령어로 해석됨

name = "ibetter"를 입력하면 Bash는 name이라는 명령어에 ="ibetter"를 인자로 전달하려 합니다. 당연히 name 명령어가 없으므로 오류가 발생합니다. = 앞뒤에 공백은 절대 넣지 않습니다.

변수 참조: $name vs ${name}

변수를 사용할 때는 $를 붙입니다.

#!/bin/bash# 새 파일: scripts/variable_demo.shname="ibetter"version="5"# $name 방식echo "사용자: $name"# ${name} 방식 (중괄호로 경계를 명확히)echo "버전: ${version}번째"# 중괄호가 없으면 변수명이 잘못 해석됨echo "버전: $version번째"    # 이건 동작하지만echo "버전: $version_release"  # 이건 version_release 변수를 찾음 (비어있음!)# 올바른 방법echo "버전: ${version}_release"exit 0

실행 결과는 다음과 같습니다.

$ bash scripts/variable_demo.sh
사용자: ibetter
버전: 5번째
버전: 5번째
버전:
버전: 5_release

$version_releaseversion_release라는 하나의 변수 이름으로 읽힙니다. 이 변수가 없으면 빈 문자열이 됩니다. ${version}_releaseversion 변수를 참조한 뒤 _release를 붙입니다. 변수명 경계가 모호할 때는 중괄호를 씁니다.

따옴표 규칙

Bash에서 따옴표의 종류에 따라 의미가 달라집니다.

큰따옴표 — 변수 확장 허용

name="ibetter"echo "안녕하세요, ${name}님"    # 출력: 안녕하세요, ibetter님echo "현재 경로: $(pwd)"        # 출력: 현재 경로: /home/user

큰따옴표 안에서는 $변수, $(명령어), \n 같은 이스케이프 문자가 처리됩니다.

작은따옴표 — 리터럴 (그대로 출력)

name="ibetter"echo '안녕하세요, ${name}님'    # 출력: 안녕하세요, ${name}님echo '현재 경로: $(pwd)'        # 출력: 현재 경로: $(pwd)

작은따옴표 안에서는 아무것도 해석하지 않습니다. $도 그냥 $ 문자입니다.

역따옴표 — 명령어 치환 (구식 방법)

current_date=`date +%Y-%m-%d`    # 역따옴표 방식 (구식)current_date=$(date +%Y-%m-%d)   # $() 방식 (권장)

역따옴표는 $() 방식의 구식 표현입니다. 중첩이 어렵고 가독성이 떨어져서 $()를 씁니다.

변수 기본값 설정

변수가 비어 있거나 설정되지 않았을 때 대체 값을 쓰는 패턴입니다.

#!/bin/bash# 새 파일: scripts/default_value.sh# ${var:-default}: var가 비어있으면 default 사용 (var는 변경 안됨)username="${1:-guest}"echo "사용자: ${username}"# ${var:=default}: var가 비어있으면 default를 var에 저장하고 사용: "${log_level:=INFO}"echo "로그 레벨: ${log_level}"# ${var:+alt}: var가 설정되어 있으면 alt 사용debug_flag="true"echo "디버그: ${debug_flag:+[DEBUG 활성화됨]}"# ${var:?error}: var가 비어있으면 오류 메시지 출력 후 종료: "${REQUIRED_VAR:?필수 환경변수 REQUIRED_VAR이 설정되지 않았습니다}"exit 0

실행 예시는 다음과 같습니다.

$ bash scripts/default_value.sh
사용자: guest
로그 레벨: INFO
디버그: [DEBUG 활성화됨]
scripts/default_value.sh: line 17: REQUIRED_VAR: 필수 환경변수 REQUIRED_VAR이 설정되지 않았습니다

${var:?error}는 필수 환경변수를 강제하는 데 자주 씁니다. 필요한 변수가 없으면 스크립트가 즉시 멈추고 이유를 알려줍니다.

패턴 의미
${var:-default} var가 비어있으면 default 반환 (var 변경 안됨)
${var:=default} var가 비어있으면 default를 var에 저장 후 반환
${var:+alt} var가 설정되어 있으면 alt 반환
${var:?error} var가 비어있으면 error 출력 후 스크립트 종료

문자열 조작

Bash는 변수 안에서 바로 문자열을 가공할 수 있습니다.

#!/bin/bash# 새 파일: scripts/string_ops.shgreeting="Hello, World!"# 문자열 길이echo "길이: ${#greeting}"           # 출력: 길이: 13# 부분 추출 ${var:offset:length}echo "앞 5자: ${greeting:0:5}"      # 출력: 앞 5자: Helloecho "뒤에서: ${greeting:7}"        # 출력: 뒤에서: World!# 문자열 연결first="Hello"second="World"combined="${first}, ${second}!"echo "${combined}"                  # 출력: Hello, World!# 문자열 치환 ${var/패턴/대체}path="/home/user/documents/file.txt"echo "${path/user/ibetter}"         # 출력: /home/ibetter/documents/file.txt# 대소문자 변환 (Bash 4.0+)text="Hello World"echo "${text,,}"    # 소문자: hello worldecho "${text^^}"    # 대문자: HELLO WORLDexit 0

실행 결과는 다음과 같습니다.

$ bash scripts/string_ops.sh
길이: 13
앞 5자: Hello
뒤에서: World!
Hello, World!
/home/ibetter/documents/file.txt
hello world
HELLO WORLD

외부 명령어(sed, awk)를 쓰지 않고도 Bash 문법만으로 상당한 문자열 처리가 가능합니다. 간단한 처리는 이 방식이 더 빠릅니다.