Skip to main content

11. Variables - Part III

4장('변수 - 1부')에서 언급했듯이 변수 주위를 괄호로 묶으면 혼동을 피할 수 있습니다:

foo=sun
echo $fooshine # $fooshine is undefined
echo ${foo}shine # displays the word "sunshine"

하지만 이 멋진 괄호에는 이 외에도 훨씬 더 강력한 용도가 있습니다. 변수가 정의되지 않았거나(undefined), null인 문제를 처리할 수 있습니다(셸에서는 정의되지 않은 것과 null인 것은 큰 차이가 없습니다).

기본값 사용하기

사용자에게 입력 메시지를 표시하지만 기본값을 허용하는 다음 코드 조각(snippet)을 살펴보세요:

#!/bin/sh
echo -en "What is your name [ `whoami` ] " 
read myname
if [ -z "$myname" ]; then
  myname=`whoami`
fi
echo "Your name is : $myname"

echo에 "-en"을 전달하면 줄 바꿈을 추가하지 않도록 지시합니다(bash 및 csh의 경우). Dash, Bourne 및 기타 호환 셸의 경우, 대신 줄 끝에 "\c"를 사용합니다. Ksh는 두 가지 형식을 모두 이해합니다. "RETURN"을 눌러 기본값을 수락하면 이 스크립트는 다음과 같이 실행됩니다:

steve$ ./name.sh
What is your name [ steve ] RETURN 
Your name is : steve

... 또는 사용자 입력으로:

steve$ ./name.sh
What is your name [ steve ] foo 
Your name is : foo

셸 변수 기능을 사용하면 이 작업을 더 잘 수행할 수 있습니다. 중괄호와 특수 ":-" 사용법을 사용하면 변수가 설정되지 않은 경우 사용할 기본값을 지정할 수 있습니다:

echo -en "What is your name [ `whoami` ] " 
read myname
echo "Your name is : ${myname:-`whoami`}"

이것은 특별한 경우로 간주될 수 있는데, 로그인 이름(UID)을 인쇄하는 whoami 명령의 출력을 사용하고 있습니다. 보다 일반적인 예는 다음과 같이 고정 텍스트를 사용하는 것입니다:

echo "Your name is : ${myname:-John Doe}"

백틱(`)의 다른 사용법과 마찬가지로 `whoami`는 서브셸에서 실행되므로 백틱 내에서 cd 명령을 실행하거나 다른 변수를 설정해도 현재 실행 중인 셸에 영향을 미치지 않습니다.

Using and Setting Default Values

변수가 정의되지 않은 경우 변수를 기본값으로 설정하는 또 다른 구문인 ":="도 있습니다:

echo "Your name is : ${myname:=John Doe}"

이 기술은 $myname 변수에 대한 이후의 모든 액세스가 항상 사용자가 입력한 값을 가져오거나 그렇지 않으면 "(John Doe)"를 가져온다는 것을 의미합니다.