앎을 경계하기

[가짜연구소3기] Data Engineer

[가짜연구소 3기] 데이터 엔지니어링 52 - Variables in Bash Scripting

양갱맨 2021. 10. 2. 15:53

Bash 스크립트에서 변수 만들기

다른 언어와 유사하게 변수를 만들 수 있다.

변수명=값  #변수선언
$변수명     #사용

Bash에서 $ 기호를 사용해야만 변수가 변수인 것을 알고 참조할 수 있다.

first = 'cynthia'
last = 'liu'
echo "Hi there " first last

$없이 변수명을 사용하면 그냥 문자열로 인식함

Hi there first last

보통 다른 프로그래밍 언어를 사용할 때 변수 할당 시, 띄어쓰기를 한다고해서 에러가 발생하거나 하지 않는다.

그러나 Bash에서는 에러가 발생하기 때문에 주의해야한다.

var1='hihi'
var2 = 'hihi'
line 2: var2: command not found

작은따옴표, 큰따옴표, 백틱

  • '텍스트'를 사용하면 안에 내용이 모두 문자열로 해석된다.
  • "텍스트"를 사용하면 안에 $ 표시나 ` 표시를 이해한다.
  • `텍스트`를 사용하면 백틱 기호 사이 모든 것을 새 셸로 보내고 결과를 다시 변수로 가져온다.

예제

now_var='NOW'
now_var_singlequote='$now_var'
echo $now_var_singlequote
$now_var

작은따옴표를 사용하면 $기호 인식이 안된다.

now_var_doublequote="$now_var"
echo $now_var_doublequote
NOW

큰따옴표를 사용해야 변수를 참조할 수 있다.

rightnow_doublequote="The date is `date`."
echo $rightnow_doublequote
The date is 2021년 9월 30일 목요일 09시 19분 09초 KST.

이번에는 date라는 현재 시각을 알려주는 셸 명령을 백틱을 사용하여 bash script에서 활용해보는 예제다.

큰따옴표로 묶은 텍스트 안에 백틱을 사용하여 셸 안에 셸을 실행할 수 있다.

백틱과 똑같은 동작을 하는 방법이 parentheses 이다.

$(명령) 으로 사용하며 이 방법이 더 현대적이다.


숫자 변수 사용하기

Bash에서는 다른 언어에서 가능한 산술 연산이 기본적으로 지원되지 않는다.

그래서 명령어를 사용해서 산술연산을 수행해야한다.

대표적으로 expr 이 있는데, 이 명령에는 큰 한계가 있다.

expr 1 + 2  # 3
expr 1 = 2.5 # error 발생

소수 연산이 안되는 문제가 있기 때문에 기본 계산기를 나타내는 bc 명령어를 사용한다.

~ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1 + 2.5
3.5
1 + 2
3
1+3
4
quit

bc 명령으로 기본 계산기 프로그램을 수행시킬 수 있고, 프로그램을 열지 않고 사용하려면 파이핑을 하면 된다.

echo "1 + 2.75" | bc  # 3.75

bc의 반환값에 대해 소수 자릿수를 지정하고 싶다면 scale 을 사용한다.

~ echo "10/3" | bc
3

~ echo "scale=3; 10/3" | bc
3.333

Bash script에서 숫자 변수 정의하기

dog_age=6

따옴표로 값을 묶어서 나타낼 수 있지만, 문자열로 취급하기 때문에 나중에 할 수 있는 작업을 제한할 수 있다.

dog_name='Roger'
dog_age=6
echo "My dog's name is $dog_name and he is $dog_age years old"
My dog's name is Roger and he is 6 years old

그리고 괄호 안에서 숫자 연산도 가능하다.

expr 5 + 7
echo $((5 + 7)) # bc가 아닌 expr 기반이다. 그런데, 소수점 계산 됨!

shell 안에 shell 다시 해보기

model1=87.65
model2=89.20
echo "The total score is $(echo "$model1 + $model2" | bc)"
echo "The average score is $(echo "($model1 + $model2) / 2" | bc)"
The total score is 176.85
The average score is 88

배열 사용하기

Bash에서는 2가지 방법으로 배열을 만들 수 있다.

  1. 데이터 요소 없이 만들기
decalre -a my_first_array
  1. 요소 추가해서 만들기
my_first_array=(1 2 3) #my_first_array=(1,2,3) 아님!!!!
my_array=(1 3 5 2)
echo ${my_array[@]} # 1 3 5 2

@을 사용해 배열의 모든 요소를 인덱싱 할 수 있다.

길이는 #를 사용한다.

echo ${#my_array[@]} # 4

Bash도 인덱싱은 파이썬처럼 제로 인덱싱을 사용한다.(0부터 시작)

요소값을 수정할 때는 $표시를 하지 않고 변수에 바로 값을 넣어준다.

my_first_array=(15 20 300 42 23 2 4 33 54 67 66)
my_first_array[0]=999
echo ${my_first_array[0]} # 999

일부 인덱싱

echo ${my_first_array[@]:3:2} # 인덱스 3에서부터 2개, 42 23

요소 추가하기

my_array=(300 42 23 2 4 33 54 67 66)
my_array+=(10)
echo ${my_array[@]} # 300 42 23 2 4 33 54 67 66 10

요소 값을 괄호로 묶지않으면 그냥 문자열 10이 첫번째 요소에 이어붙여져 30010 이 된다.

연관 배열(Associative array)

연관 배열은 파이썬의 dictionary와 유사하다.

연관 배열을 사용하려면 bash 버전이 반드시 4이상이어야 한다.

declare -A city_details
city_details=([city_name]="New York" [population]=14000000)
echo ${city_details[city_name]} #New York 출력

-A 옵션을 사용하여 연관 배열을 가질 변수를 할당한다.

연관배열은 ([key1]=값1 [key2]=값2) 형태로 정의할 수 있다.

인덱싱은 key로 한다.

만약 모든 key를 확인하고 싶으면 !를 사용한다.

echo ${!city_details[@]} #city_name population