본문 바로가기

별걸다하는 IT/리눅스 유닉스

[linux/unix/스크립트]셸 프로그래밍 기초 - 변수와 특수문자,빈 변수, 변수의 종류~ 변수총정리

반응형

[유닉스, 리눅스 셸 스크립트 프로그래밍 목차]

코딩을 항상 배우면 가장 먼저 배우게 되는 변수~~~

오늘도 어김없이 찾아오는 변수편입니다. ㅎㅎ

변수란?! <--- 변수라는 단어가 뭘 의미하는지를 정리해놓은 완전 기초 포스팅

셸 스크립트에서 사용되는 변수의 특징!

셸 스크립트에서 사용하는 변수는 일반 C언어나 자바에서 사용하는 변수와 문법적 차이가 약간 있어요.

1. 먼저, 타입을 선언하지 않습니다. 문자열이 default!

string fname = "logfile"; //<-- C언어 문자열 변수 선언 
fname=logfile //<- shell script

네.. C언어나 자바의 경우, 정수일 경우 int라는 타입을 명시해주고 문자열일 경우 string이나 이런 타입을 앞에 붙여주죠? 셸 스크립트에서 변수를 생성할 때에는 타입을 지정하지 않습니다. 왜냐 무조건 다 문자열로 받아들이거든요. 

문자열이 띄어쓰기가 없을 경우 큰따옴표를 붙이지 않아도 됩니다. 다만 공백이 안에 있으면 ""로 감싸줘요.

 

2. 문자열이 default이니 숫자를 넣어도 문자로 취급

count=3

여기서 3은 숫자가 아니라 문자로 취급됩니다.

3. 변수를 대입할 때 좌우에 공백이 있으면 안됩니다.

city=Seoul //correct 
city =Seoul //incorrect 
city= Seoul //incorrect

실습~~~ 화면에 출력 명령어는 echo를 사용하면 돼요! echo "문자열" 하면 문자열을 그대로 출력시켜주고, echo $변수명 : 변수값을 출력시켜줍니다.

참고로 이때 선언된 변수는기본적으로 전역변수입니다. 그런데 전역변수는 현재 실행된 스크립트 파일에서 유효해요. 자식 스크립트에서는 사용할 수 없는 변수이니 주의! 나중에 그래서 다른 스크립트에서 사용하기 위해 export를 사용하기도 합니다.

 

4. $fname은 ${fname}을 짧게 쓴 표현입니다.

5. 변수명은 숫자, 그리고 언더바'_', 그리고 영문자로만 이루어집니다. 그 외의 문자는 변수명으로 인식하지 못해요.

따라서 $fname.20190614에서 $fname만이 변수명이 될 수 있어요. 이러한 특성 때문에 뒤에 로그의 경우라던가 이럴 때 뒤의 날짜 빼고 순수한 파일명만 변경할 수도 있고 파일명은 그대로 .이후만 변경할 수도 있습니다.

6. 참고로 변수명은 대소문자를 구분합니다.

7. 변수에서 ""(큰 따옴표)와 ''(작은 따옴표)의 역할

C언어나 자바에서는 큰따옴표가 String을 의미하죠. 하지만 셸 스크립트에서 모든 변수값을 문자열이라 기본으로 인식하기 때문에 큰 따옴표가 딱히 필요가 없습니다. 셸에서 큰 따옴표란 그룹을 묶는 기능으로 이해하면 편합니다.

# echo "\abc" 
\abc 
# echo '\abc' 
\abc 
# echo \abc 
abc

묶었을 때랑 안묶었을 때랑 차이가 보이죠?

역슬래시는 영문자, 숫자, 언더바가 아니기 때문에 변수명이 될 수 없습니다. 또한 변수에 저장할 때도 사진을 보면 알 수 있듯이 역슬래시가 빠진 값이 들어갑니다. 하지만 큰 따옴표는 이를 묶어줄 수 있어요!! 물론 특수문자뿐만 아니라 문자열에 공백이 포함되어 있을 경우에도 묶어 줍니다.

큰따옴표는 이렇게 특수문자를 보존시켜주는데 ""보다 ''가 더 강력하게 보호해줍니다. 예를 들어 '$'라는 문자가 들어간 글자를 출력하려면 큰따옴표가 아닌 작은 따옴표로 묶어줘야 해요. 요런 약간의 차이가 있지만 일반적으로는 동일하게 인식합니다. 

 

그런데 변수에 입력된 값에 공백이 포함될 수 있다면 작은따옴표가 아닌 큰따옴표에 넣어서 사용하는게 공백 때문에 발생할 수 있는 오류를 방지해주니까 이럴 경우에는 큰 따옴표에 넣읍시다 ㅎㅎ

 

8. 빈 변수를 만들어주고 싶다면? 빈문자열 변수

안에 아무것도 저장되어 있지 않은 empty한 문자열을 저장하고 싶다면?

emptyVar='' 
emptyVar2="" 
emptyVar3=

요 방식으로 저장해주면 됩니다.

# echo "emptyVar = $emptyVar" 
emptyVar =

요렇게 결과가 나옵니다. ㅎㅎ

그런데 재미는 점은 이렇게 비어있을 경우에는 0인 것처럼 산술 연산이 먹습니다. 

참고로 let은 산술연산을 가능하게 해주는 명령어예요.

 

9. 괄호를 사용하면 다양한 변수 사용이 가능하다. - 매개 변수 확장

음.. 4번에서 $fname이 ${fname}을 짧게 쓴 표현이라 했죠?!

그것도 맞는데 사실 이렇게 괄호에는 더 많은 기능이 포함되어 있어요.

하나의 예로 city란 변수에는 "\Seoul"이라는 문자열이 저장되어 있는데 얘를 출력하기 위해 echo함수를 사용하잖아요? 근데 괄호 맨 앞에다가 #을 붙여주면 그 변수의 길이를 리턴해줍니다. 이런식으로 정해진 규칙들이 많이 있어요. 매개 변수 확장에서 더 많은 정보들을 배울거예요 ~

 

변수의 종류

변수는 이 외에도 개념과 사용에 따라 다양한 종류로 나눠지고 불리고 있습니다.

● 지역변수/ 전역변수 - 포스팅 하단 부문

● 예약변수 (Reserved Variable) - 포스팅 하단 부문

● 위치 매개 변수 (Positional Parameters)

● 특수 매개 변수 (Special Parameters)

● 매개 변수 확장 (Parameter Expansion)

● 환경변수 (환경 변수에 대한 포스팅)

등등..

 

오늘은 지역변수, 전역변수의 개념과 예약변수에 대해서 알아보고

특수 문자를 이용해서 사용되는 변수들은 다음 포스팅으로 나눠서 살펴볼게요 ㅎㅎ

 

전역 변수 vs 지역 변수

셸 스크립트 프로그래밍에서 전역변수란, 그 해당 스크립트 내에 어디에서든 접근 가능한 변수를 말해요.

(시스템에 있는 모든 스크립트에서 접근 가능한 게 아니니 주의하세요!)

그래서 A스크립트에서 B스크립트를 호출했을 때 A스크립트가 B스크립트에 정의되어 있는 변수를 사용할 수 없습니다. 전역변수여도 마찬가지!! 이럴 경우 export라는 키워드를 이용해서 변수를 사용할 수 있게 배출(?)해줘요ㅎㅎ

반면에 지역변수란, 블록에서만 유효한 변수, 즉 함수에서만 사용되는 변수를 말해요. local이라는 키워드를 앞에 붙임으로써 지역변수로 설정할 수 있어요.

 

테스트해볼게요~ 아래처럼 test.sh를 작성해줍시다.

#! /bin/sh 
GLOBAL="global variable" 
testVar(){ #함수예요 
	local LOCAL="local variable" 
    echo $GLOBAL 
    echo $LOCAL 
} 
echo "function start" 
testVar 
echo "function end" 
echo $GLOBAL 
echo $LOCAL

아래 결과를 보면 전역변수는 함수내에도 접근 가능하니 전역변수와 지역변수가 모두 호출이 잘 됐지만 함수가 끝난 후에는 LOCAL에 저장된 값이 출력되지 않음을 확인할 수 있어요

예약변수 목록

예약변수는 이미 시스템 상에서 사용하기 위해 변수를 고정시켜놓은 것이기 때문에 해당 이름으로 우리가 변수를 생성해서는 안됩니다. 마치 C언어에서 변수를 if라고 이름지으면 안되는거랑 동일한 이치예요.

이미 환경변수로 시스템에서 사용하고 있는데 우리가 같은 이름의 변수를 선언해버리면 혼돈의 카오스가 되겠죠?ㅎㅎ

PS1

PS2

PS3

PS4

TMOUT

HOME

PATH

LANG

PWD

SHELL

SHLVL

UID

EUID

USER

USERNAME

GROUPS

FUNCNAME

SECONDS

PPID

BASH

BASH_NEW

BASH_VERSION

BASH_VERSINFO

MAIL

MAILCHECK

OSTYPE

TERM

HOSTNAME

HOSTTYPE

MACHTYPE

LOGNAME

HISTFILE

HISTSIZE

HISTCONTROL

DISPLAY

IFS

VISUAL

EDITOR

COLUMNS

LINES

LS_COLORS

if

then

else

elif

fi

case

esac

for

while

until

do

done

select

time

등등..

요기까지~~ 오늘도 방문해주셔서 감사합니다 ♥

공감, 댓글 또는 광고보답은 질 좋은 정보를 공유하는데 힘이 됩니다 :) 

다음 포스팅에서 또 봐요~

반응형