- 셸의
:는 아무 동작 없이 인수만 평가해 버리는 널 명령(null command) 으로, 매개변수 확장과 결합하면 필수 인수 검사와 기본값 설정을 간결하게 처리할 수 있음
: "${1:?missing argument, aborting!}"는 $1이 없거나 비어 있으면 진단 메시지를 stderr에 출력하고 0이 아닌 상태로 종료함
${VAR:=default}를 :의 인수로 전달하면 확장은 실행하되 결과 문자열은 버리므로, 확장 결과를 명령으로 실행하지 않고 기본값만 설정할 수 있음
- 리디렉션을 통한 파일 비우기와 접근 가능 여부 검사,
trap의 빈 명령, set -u 환경의 변수 검사, 비어 있는 조건 분기에도 :를 활용할 수 있음
: "${VAR:=default}"는 변수명을 한 번만 써서 오타 가능성을 줄이고, while:에서는 항상 성공하는 조건이 되어 무한 루프를 표현함
널 명령과 매개변수 확장
:는 인수를 평가한 뒤 결과를 버리는 널 명령 내장 명령임
- 네 줄짜리 조건문 대신 다음 한 줄로 필수 인수를 검사할 수 있음
: "${1:?missing argument, aborting!}"
echo "Hello $1!"
- 매개변수 확장 구문
${name:?diagnostic}는 $name이 설정되지 않았거나 비어 있는지 검사함
- 값이 없으면
diagnostic을 stderr에 출력하고 셸을 0이 아닌 상태로 종료함
- 값이 있으면
$name과 같은 결과를 냄
- 널 명령 없이
${HELLO:=123}만 실행하면 확장 결과인 123을 명령으로 취급해 command not found가 발생함
: ${HELLO:=123}는 확장을 평가해 HELLO=123을 설정하면서 그 결과는 버림
: "${DATA_DIR:=/var/data}"는 DATA_DIR="${DATA_DIR:-/var/data}"와 달리 변수명을 한 번만 적으므로 DATA_DRI 같은 오타 가능성을 줄일 수 있음
:를 활용하는 방법
-
기본값 설정
- 확장 결과를 실행하지 않고 버리면서 변수의 기본값을 설정함
: "${DATA_DIR:=/var/data}"
: "${RETRIES:=3}"
-
파일 비우기와 접근 검사
- 리디렉션과 결합하면 하나 이상의 파일을 비울 수 있음
: > error.log
: > error.log > access.log
- 서브셸과 리디렉션을 이용해 파일의 읽기·쓰기 가능 여부도 검사할 수 있음
( : < dataset.json ) && echo YES
( : >> result.json ) && echo YES
-
빈 명령이 필요한 자리
trap처럼 문법상 명령이 필요하지만 실제 작업은 하지 않아야 할 때 사용할 수 있음
trap : INT
sleep 60
if some-command; then
:
else
echo "command failed"
fi
-
여러 변수 검사
set -u가 활성화된 상태에서 여러 변수가 설정됐는지 한 번에 검사함
set -u
: "$DEPLOY_ENV" "$HOST"
-
무한 루프
:는 항상 성공하는 조건이므로 무한 루프를 간결하게 작성할 수 있음
while :; do
echo "I love colons"
sleep 1
done