해당 내용은 Datacamp의 Data engineering track을 정리했습니다.
Introduction to Bash Scripting의 chapter 2에 대한 내용입니다.
해당 포스팅에는 아래의 내용을 포함하고 있습니다.
- 변수 할당하기, quote 차이
- Bash에서 숫자 연산하기(expr, bc)
- Bash에서의 array 형태 2가지(list, dict)
1. Basic variables in Bash
Bash의 할당은 다른 언어와 유사합니다.
var1="Moon"
echo $var1
> Moon
위의 방식처럼 = 를 기준으로 좌측에는 변수명, 우측에는 넣고싶은 값을 넣어주면 할당이 됩니다. 다만, 주의해야할 점은 =를 기준으로 좌우에 공백이 있으면 안됩니다. 또한 변수에 접근하기 위해서 $var1으로 써줘야 합니다.
Bash에서는 ', ", ` 3개의 의미가 조금씩 다릅니다. 먼저, '는 그 사이에 있는 내용을 문자 그대로 해석하는 의미를 가지고 있습니다. "는 '과 유사하지만 따옴표 사이에 발생하는 달러 기호와 `를 인식합니다. `는 사이에 있는 모든 내용을 새로운 쉘로 보내고 결과를 다시 변수로 가져오는 역할을 합니다.
now_var='Now'
now_var_singlequote='$now_var'
echo $now_var_singlequote
> $now_var
now_var_doublequote='$now_var'
echo $now_var_doublequote
> $Now
위의 예제처럼 '는 $를 포함한 변수를 인식하지 못하는 것을 알 수 있습니다.
` 사용법은 date 프로그램을 사용한 예제를 보면서 이해하실 수 있을 겁니다. 우선 date는 현재 날짜, 시간이 문자열로 출력합니다.
rightnow_doublequote="The date is `date`."
echo $rightnow_doublequote
> The date is Mon 2 Dec 2019 14:13:35 AEDT.
rightnow_parentheses="The date is $(date)."
echo $rightnow_parentheses
> The date is Mon 2 Dec 2019 14:13:35 AEDT.
이처럼 shell의 결과를 변수로 넣어서 출력할 수 있도록 하는 것을 알 수 있습니다. 각각의 기호는 다른 쓰임새를 갖고 있음을 잊지 않아야 합니다.
2. Numeric variables in Bash
일반적으로 Bash에서 기본적인 숫자 변수 사용하기 어렵습니다. R이나 Python에서는 1+4처럼 쉬운 계산을 입력해도 알아서 계산해주지만 Bash는 그렇지 않습니다. 그래서 Bash에서 해결하기 위해서 expr과 bc(basic calculator)를 통해 계산할 수 있습니다.
expr의 경우 손쉽게 사용할 수 있으나, 소수점 계산을 못하는 한계가 존재합니다. 또한 아래 코드를 보면, 공백이 존재해야 각 인수를 연산할 수 있습니다. 만약 expr 뒤에 연산을 붙여서 적용하면 하나의 문자로 인식하고 그대로 출력할 수 있습니다.
# 공백 있을 때
expr 1 + 4
> 5
# 공백 없을 때
expr 1+4
> 1+4
expr에서 불가능했던 소수점 연산을 할 수 있는 것이 bc입니다. bc를 shell에서 입력하면, bc 호출되고 원하는 연산을 입력할 수 있습니다. 이때에는 위의 expr과 다르게 띄어쓰기 공백은 중요하지 않습니다. bc를 모두 사용했다면 quit으로 종료할 수 있습니다.
위의 방법처럼 bc를 직접 실행해서 안에서 계산할 수도 있지만 1줄로 표현해서 bc로 넘겨주는 방법도 가능합니다.
echo와 함께 사용해서 연산하고 싶은 내용을 bc로 넘겨줄 수 있고, scale은 소수점의 아래 몇자리까지 출력할 지 설정할 수 있습니다. 기본적으로 10/3 연산은 무한소수로 되어 있기 때문에 기본적으로 scale을 지정하지 않으면 3이라는 값을 출력합니다. 반대로 scale=3으로 지정하면 소수점 아래 3째자리까지 살리고 버리는 것을 알 수 있습니다. scale을 지정할 때에는 뒤의 연산과 구분하기 위해서 세미콜론을 써야 합니다.
마지막으로 숫자변수를 다른 변수에 입력한 뒤에 이를 활용하는 방법에 대해 다뤄보겠습니다. 기본적으로 Bash에서 변할당할 때, 공백이 존재하지 않아야 합니다.
# 잘못된 방법
dog_name = "Roger"
# 올바른 방법
dog_name="Roger"
위의 방식처럼 변수에 수치 값을 입력해서 이를 계산하도록 넘겨줄 수 있습니다.
3. Arrays in Bash
Bash에는 2개 종류의 Array가 존재합니다. 1개는 파이썬의 리스트와 동일하고 다른 하나는 파이썬의 딕셔너리와 같습니다.
리스트 형태의 Array 만드는 방법은 아래와 같습니다.
# 원소 추가없이 list 생성
declare -a my_first_array
# 원소 추가하여 생성
my_first_array=(1 2 3)
리스트를 만들 때에는 등호 좌우에 공백을 사용하면 안되고 소괄호와 원소와 원소를 comma로 구분하지 않고 공백으로 구분합니다.
# 모든 리스트 확인
my_array=(1 3 5 2)
echo ${my_array[@]}
> 1 3 5 2
리스트에 접근하기 위해서는 리스트를 {}로 둘러싸야 합니다. 추가적으로 모든 정보를 꺼내오기 위해서는 [@]로 가져올 수 있습니다. @대신 숫자를 입력하면 해당 인덱스에 맞는 값을 가져옵니다. 숫자 인덱싱은 파이썬과 동일하게 zero 인덱스를 사용합니다. 또한 슬라이싱 기능도 가능합니다.
# N번째 인덱스의 값부터 M개 출력
echo ${my_array[@]:N:M}
# 0번째 인덱스에 값 수정
my_array[0]=999
# array에 원소 elements를 array 마지막에 추가
my_array+=(elements)
만약에 elements를 append할 때 괄호를 사용하지 않으면, 맨 처음 원소 뒤에 붙게 됩니다. 예를 들어, 첫번째 원소가 99고 추가하려는 원소가 88일 때, 첫 번째 원소가 9988이 됩니다. 이 부분에 유의해야 합니다.
다음으로 associative array라고 딕셔너리 형태에 대해 다뤄봅시다. 기본적으로 associative array는 bash의 버전이 4 이상이어야 사용이 가능합니다. 위에서 declare로 선언한 것처럼 하되 -a 대신 -A를 사용하면 됩니다. 딕셔너리는 키와 밸류의 쌍 구조를 가지기 때문에 기존 리스트 형태와는 다릅니다.
# associative array 선언
declare -A city_details
# 원소 추가
city_details=([city_name]="New York" [population]=14000000)
# key에 해당하는 value 출력
echo ${city_details[city_name]}
> New York
# key 값 출력
echo ${!city_details[@]}