[유닉스] 쉘 스크립트(Shell Script) 변수 사용하기


쉘 스크립트(Shell Script) 변수

  • 쉘 변수 : 지역 변수, 환경 변수
  • “변수명=값” 형태로 정의와 동시에 값을 저장

  • -, =, +, ?에 콜론을 붙이면 변수에 값이 정의되어 있거나 널 값으로 설정되어 있는 지 확인
  • 콜론을 사용하지 않으면 널 값으로 정의된 변수도 설정된 것으로 간주
  • test는 값이 정의되어 있으므로 정의된 값을 출력
  • test1은 값이 정의되어 있지 않으므로 word 값을 출력
$ test=unix
$ echo $test
unix
$ echo ${test:-word}
unix
$ echo ${test1=-word}
word
$
  • test는 값이 정의되어 있으므로 대체되지 않고 정의된 값을 출력
  • test1은 값이 정의되어 있지 않으므로 주어진 linux라는 값으로 대체됨
$ echo ${test:=word}
unix
$ echo ${test1:=linux}
linux
$ echo ${test1:=temp}
linux
$
  • test는 값이 정의되어 있으므로 word 값으로 대체되어 출력
  • test 값이 정의되어 있으므로 정의되어 있는 값으로 출력
  • test2는 변수가 없으므로 word 출력 후 스크립트 종료(스크립트 파일에서 실행할 경우 종료)
$ echo ${test:+word}
word
$ echo ${test:?word}
unix
$ echo ${test2:?word}
-bash: test2: word
$

쉘 변수 문자열 처리하기

  • 변수 값이 문자열일 때 문자열 내에 포함된 패턴을 찾아 일부를 제거할 수 있음

%는 변수의 뒤부터 지정한 패턴과 일치하는 가장 최소 부분을 제거 - 패턴으로 local을 지정하면 아무 것도 삭제되지 않고, local부터 나머지 문자열을 모두 삭제하고 싶으면 패턴을 /local*로 지정해야 함

  • %%는 패턴과 일치하는 최대 부분 제거
$ path1=/usr/bin/local/bin
$ echo ${path1%/bin}
/usr/bin/local
$ echo ${path1%%/bin*}
/usr
$
  • ’#’은 변수에 저장된 문자열의 앞부분부터 일치하는 패턴을 검색하여 최소로 일치하는 부분을 제거
  • ’##’은 모든 /가 포함된 문자열을 제거할 수 있어서 경로의 마지막에 나오는 파일 이름만 알아낼 때 유용함
$ path2=/home/user1/.profile
$ echo ${path2#/home}
/usr1/.profile
$ echo ${path2##*/}
.profile
$
  • ‘#변수’는 변수에 지정된 문자의 개수를 출력
$ echo ${#path1}
18
$ echo ${#path2}
20
$

명령행 인자(파라미터, parameter) 처리하기

  • 스크립트 실행할 때 인자로 주어진 값을 스크립트 안에서 처리할 수 있음
  • 포지션 인자(Positional Parameter)라고 하는 특수 내장 변수들은, 명령행에 입력된 인자의 순서에 따라 이름이 정해지며 주어진 인자를 저장
  • 쉘 스크립트의 이름은 $0 변수에 저장됨

인용 부호 처리

  • 스크립트에서 인용 부호는 쉘 특수문자(Metacharacter : $, *, ? 등)의 의미를 없애기 위해 사용
  • 인용 부호 : ‘ ’(작은 따옴표), “ ”(큰 따옴표), (역슬래시)
  • 작은 따옴표(‘ ’)
    • 모든 특수 문자들이 해석되는 것을 막음
    • 쌍으로 사용
    • 작은 따옴표 자체를 출력시키려면 큰 따옴표 안에서 사용하거나 (역슬래시) 다음에 사용
$ test=100
$ echo $test
100
$ echo ‘$test
$test
$ echo  100 
100
$ echo ‘$test
> ^C
$
  • 큰 따옴표(“ ”)
    • 변수나 명령의 대체를 허용하지만 기타 특수 문자들이 해석되는 것을 막음
    • 쌍으로 사용
$ test=200
$ echo $test
200
$ echo “$test
200
$ echo “$(date)
2015. 07. 15. () 21:17:07 (KST)
$ echo “$test
> ^C
$
  • 역슬래시()
    • 단일 문자가 해석되는 것을 보호하기 위해 사용
    • 큰 따옴표 안에서 역슬래시는 $를 보호하여 해석되지 않도록 함
$ echo \
> ^C
$ echo \\
\
$ test=100
$ test ‘\$test
\$test
$ echo “$test
100
$ echo “\$test
$test
$

명령 대체

  • 명령의 출력을 변수로 지정하여 사용하는 것
  • 모든 쉘은 백쿼터(`)를 사용하여 명령을 대체함
  • 백쿼터는 쌍으로 사용
$ echo date
date
$ echo $date
$ echo `date`
2015. 07. 15. () 21:45:54 (KST)
$ echo `date`
`date`
$ echo `date`
2015. 07. 15. () 21:53:44 (KST)
$ echo $(date)
2015. 07. 15. () 21:53:51 (KST)
$ echo “$(date)
2015. 07. 15. () 21:54:05 (KST)
$