프로그래밍/Bash

[bash 쉘 스크립트] 변수 할당(assignment)과 치환(substitution)

Peter Ahn 2020. 8. 17. 22:49
반응형

개요

 

안녕하세요 피터입니다.    

오늘은 Bash 쉘 스크립트에서 사용되는 변수(variable)에 대해서 설명드리겠습니다. 

변수는 모든 프로그래밍 언어와 스크립트 언어에서 핵심적인 기능을 합니다. 데이터를 조작하기 위한 연산이나 문자열을 파싱(parsing)하는데 있어서 없어서는 안될 꼭 필요한 존재입니다.

 

변수는 단지 데이터를 담고 있는 메모리상의 위치를 나타내는데 어떤 변수에 어떤 데이터가 담겨있는지 쉽게 알 수 있게 이름을 붙여놓은 것입니다. 

 

 

변수 할당(assignment)

 

데이터를 담는 공간인 변수를 사용하려면 먼저 변수를 할당(assignment) 해야 합니다.

 

변수는 할당 연산자 = 를 사용해서 할당합니다.

 

a=100
b="hello"

 

주의 해야 할 것은 할당 연산자 앞뒤로 공백이 없어야 한다는 것입니다.  

(또한 테스트 연산자도 = 심볼을 쓰기 때문에 헷갈리지 말아야 합니다. 상황에 따라 해석이 달라지니 주의해주세요. 이 부분은 나중에 테스트 연산자 설명드릴 때 다시 말씀드리겠습니다.)

 

Bash 는 다른 프로그래밍 언어들과는 달리, 변수를 "타입"으로 구분하지 않습니다.

Bash 변수는 본질적으로 문자열이지만 Bash 가 문맥에 따라서 정수 연산이나 변수를 비교해 줍니다. 이 동작을 결정짓는 요소는 그 변수값이 숫자로만 되어 있는냐 아니냐 입니다.

 

 

let 명령어로 할당 할 수도 있습니다.

let은 bash 의 내장 명령어 중에 하나로 간단한 산술식을 수행 할 수 있습니다.

 

let a=1000+4
let "a = 1000 + 4"   # 위와 같음

 

가독성을 위해서는 " " 를 이용해서 쿼우팅(quoting) 하고 연산자 사이에 빈칸(space)을 넣어주는게 좋습니다. 

 

 

변수를 할당 할 때는 위의 숫자 100이나 문자열 "hello"와 같은 리터럴 상수(literal constant) 뿐만 아니라 명령어의 결과를 할당 할 수도 있습니다. 

 

바로 명령어 치환(command substitution)을 사용하는 방법인데요.  역따옴표(` `) - 백틱(backticks)으로 명령어를 감싸면 해당 명령어의 결과로 치환되어 그 결과를 변수에 바로 할당 할 수가 있습니다. 

 

ret=`ls -l`

 

명령어 치환에 대해서는 다룰 내용이 좀 더 많기 때문에 나중에 포스팅을 추가로 하겠습니다. 

 

 

 

변수 치환(substitution)

 

변수는 데이터를 담고 있는 그릇 역할을 하므로, 할당하였으면 이제 변수에 담겨있는 데이터를 사용 할 수 있어야 합니다. 

변수에는 어떤 계산을 하기 위해 임시로 저장한 중간값이나 특정 명령어의 결과값 등이 저장되어 있는데 이 값들을 확인하거나 적절히 활용하기 위해서는 치환(substitution)을 통해 변수의 데이터를 참조해야 합니다.

 

치환은 ${variable} 구문을 이용하여 사용하는데 $variable 로 줄여 쓸 수 있습니다. 

 

참조되는 값을 큰따옴표(" ")로 묶어도 변수 치환이 일어나는 것을 막지 못합니다.

이를 부분적 쿼우팅(partial quoting)이나 약한 쿼우팅(weak quoting)이라고 합니다. 

 

작은따옴표를 쓰게 되면 변수 이름이 그냥 문자 그대로 해석되어 아무런 일도 일어나지 않습니다.

이를 완전한 쿼우팅(full quoting)이나 강한 쿼우팅(strong quoting)이라고 합니다.

 

#!/bin/bash

a=1004
echo "$a"  # $a 변수 치환이 일어남 
echo '$a'  # $a를 문자 그대로 해석 


실행 결과
100
$a

 

 

변수를 할당하지 않고 참조하게 되면 문제가 생깁니다.

변수에 어떤 값을 처음 할당 하는 것을 초기화(initialize)라고 하는데, 초기화가 안 된 변수는 "null" 값을 가집니다.

이는 값이 할당 안 된 것이지 0 이라는 값을 갖는다는 이야기가 아닙니다. 

 

변수를 참조하기 전에 반드시 할당을 먼저 해주시기 바랍니다. 

 

 

 

 

-Peter의 우아한 프로그래밍

여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

 

 

 

반응형