bash shell은 리눅스 프로그래밍의 끝판왕이라 생각된다. 물론 다른 언어들도 존재하지만 bash shell을 능숙하게 다루게 되면 반복적인 일을 단방에 해결할 수 있도록 도와준다.
1. 변수선언
보통 다른 언어들( C/C++/C# .. ) 에는 자료형이라고 해서 변수의 타입이 존재합니다.
변수타입은 꼭 소스 언어 뿐만아니라 '연산'기능이 있는것들은 자료형(데이터형식)이 있습니다.
가령 Excel과 같은 프로그램도 '날짜'/'시간'/'원화' 등등 여러 형태가 존재합니다.
하지만 이 망할 bash는 따로 그걸 구분해 놓지 않았습니다.
사용자가 알아서 판단해야 합니다.
이제 알아보도록 합시다.
[기본규칙] '공백'은 개나줘라!!
bash shell의 가장 기본은 '공백'을 최대한 사용하지 않는것입니다.
변수를 선얼할 때에도 '공백'을 사용하면 Error가 발생합니다.
[변수선언]
value=1
string="hello"
반면 아래처럼 공백을 사용하면 새됩니다.
[변수선언 새되는 예]
value = 1
string ="hello"
다시한번 말하지만 '='등호 앞뒤로 공백을 사용하면 안됩니다.
그리고 bash shell은 숫자와 문자 개념만 존재하므로 숫자는 그냥 저렇게 쓰시고
문자는 "(큰따옴표)를 사용해주시면 좋습니다.
그렇다고 value=1 이라고 해서 '1'이.. 숫자는 아닙니다. 1역시 문자입니다.
2. 출력
보통 출력명령으로 여러가지를 사용할 수 있지만 'echo'를 사용합니다.
echo 는 리눅스 기본명령어이고 아래와 같이 사용합니다.
echo "출력하고싶은내용"
echo : 명령어
" : " " 따옴표 사이를 출력하겠따는 명령어
쉽죠?
그럼 예를들어볼께요.
<test.sh>
#!/bin/bash
NUMBER=1
STRING="HELLO"
echo "NUMBER"
echo "STRING"
자! <test.sh > 라는 sh 파일을 만들었습니다.
( c++파일명은 .cpp, c 파일명은 .c bash shell 의 파일명은 .sh 입니다. )
#!/bin/bash : 이파일은 스크립트 파일이다 라는것을 알려줍니다. ( c에서 #include stdio.h 와 비슷한 역할입니다. )
NUMBER=1 : NUMBER라는 변수를 1로 선언하고 초기화 했네요
STRING="HELLO" : STRING이라는 변수를 HELLO로 선언하고 초기화 했습니다.
echo "NUMBER" : 음.. 의도가 뭘까요? 진짜 NUMBER를 출력하고 싶은걸까요? 1을 출력하고 싶은걸까요?
echo "STRING" : 역시 STRING을 출력하고 싶은걸까요? HELLO를 출력하고 싶은걸까요?
실제 출력결과를 보시죠
[sh test.sh 출력결과]
NUMBER
STRING
아시겠죠? 그냥 "(따옴표사이를 출력해줍니다)"
그러면 느낌 오시지요??? 이게 C언어처럼 '서식문자'개념이 존재합니다. 그러면 1 그리고 HELLO를 출력할 수 있게 바꿔보겠습니다.
<Newtest.sh>
#!/bin/bash
NUMBER=1
STRING="HELLO"
echo "${NUMBER}"
echo "${STRING}"
[sh Newtest.sh 출력결과]
1
HELLO
자 기존 test.sh를 Newtest.sh 로 바꾸었습니다. echo 부분만 잘보시면 됩니다.
${변수명} 형태로 되어있죠? 이렇게 사용하시면 됩니다.
근데 저렇게 단순 변수는 $변수 만 써도 출력이 됩니다.
하지만 배열과 같은 변수명선언시 어차피 ${} 요걸로 해야되기에 그냥 ${} 이렇게 알고 있으면 안까먹습니다.
3. 변수연산
이제 NUMBER=1 그리고 NUMBER2=2 만들어서 'NUMBER3=NUMBER+NUMBER2' 이런걸 하고 싶잖아요??
요런것들을 한번 해보도록 할께요.
변수명이 대문자니까 쫌.. 그렇죠? 그냥 소문자 'value'로 test2.sh를 만들어 볼께요.
<test2.sh>
#!/bin/bash
value1=1
value2=2
value3=value1+value2
echo "${value3}"
[sh test2.sh 출력결과]
value1+value2
미쳤죠? 원하는 답은 '3'이였는데, 이런 젠장할.. value1+value2 ?? 한번 살펴보죠
value1=1 : 변수선언에 문제 없죠?
value2=2 : 역시문제 없습니다.
value3=value1+value2 : 문제가 없어 보이긴 하죠?
echo "${value3}" : 이것도 ${} 이렇게 잘표현 했죠?
어라? 근데 출력결과를 잘살펴보세요.
value1+value2
bash shell 녀석은 value3을 정확히 표현한게 맞아 보여요.
실제로 'value1+value2'를 문자로 인식했어요!
우리는 1+2로 인식하기를 바랬는데요.
감오죠? value1 그리고 value2의 값을 연산하기 위해서는 역시 ${}것을 사용해야 합니다.
Newtest2.sh 로 다시 해보죠
<Newtest2.sh>
#!/bin/bash
value1=1
value2=2
value3=${value1}+${value2}
echo "${value3}"
[sh Newtest2.sh 출력결과]
1+2
엥?? 실제로 1 그리고 2가 먹긴 먹었어요.
그렇다면 value3 요녀석이 지금 1+2 라는 문자값을 갖고 있다고 해석하는게 맞습니다.
단순히 '+' 이녀석을 사용한다고 연산이 되지 않는것을 봤습니다.
진짜 돌고 돌아서 왔는데, 이거 한번 이렇게 보면 안까먹습니다.
expr 이녀석이 필요합니다.
그냥하면 안되고, expr을 붙여서 컴퓨터한테 "야! 이거 문자아니고 숫자야 그러니까 계산해라!" 라고 알려줘야 합니다.
NewNewtest2.sh 로 확인해보자
<NewNewtest2.sh>
#!/bin/bash
value1=1
value2=2
value3=`expr ${value1} + ${value2}`
echo "${value3}"
[sh Newtest2.sh 출력결과]
3
와우, 드디어 3이 나왔다. 그렇지만 이걸 알아야한다.
value3=`expr ${value1} + ${value2}` : `expr ` 이게 한 묶음이다.
` : 요녀석은 '숫자1' 왼쪽에 있는 물결표시를 Shift를 누르지 않고 입력한 녀석이다.
그리고 가장 중요한것은 바로 '+' 플러스 기호 양옆이... 공백이라는 점이다.
이게 실수하기 진짜 쉬운데.. 한번 바두면 잘 실수 안한다.
그러면 calc.sh 로 '곱하기' '빼기' '더하기' '나누기' 다 해보자
<calc.sh>
#!/bin/bash
value1=10
value2=5
resultA=`expr ${value1} + ${value2}`
resultB=`expr ${value1} - ${value2}`
resultC=`expr ${value1} '*' ${value2}`
resultD=`expr ${value1} / ${value2}`
echo "resultA=${resultA}"
echo "resultB=${resultB}"
echo "resultC=${resultC}"
echo "resultD=${resultD}"
[sh calc.sh 출력결과]
resultA=15
resultB=5
resultC=50
resultD=2
다른건 볼필요 없고 resultA,B,C,D 초기화부분만 확인해보자
resultA=`expr ${value1} + ${value2}` : +는 그냥 적었다
resultB=`expr ${value1} - ${value2}` : - 도 그냥 적혀있다.
resultC=`expr ${value1} '*' ${value2}` : '*' ??? 뭥미???
resultD=`expr ${value1} / ${value2}` : / 뭐 이해간다.
resultC 즉, 곱셉을 할때 '*' 이렇게 사용을 한다.. 젠장. 이건 외워야된다. 규칙이 이러니.. 뭐 별수 없다.
그래서 나는 그냥 연산기호는 앞뒤로 전부 작은따옴표를 붙인다.
resultA=`expr ${value1} '+' ${value2}`
resultB=`expr ${value1} '-' ${value2}`
resultC=`expr ${value1} '*' ${value2}`
resultD=`expr ${value1} '/' ${value2}`
외우기 싫으니까 안외우고 그냥 저렇게 모든 연산제에 작은 따옴표를 붙인다.
이게 변수연산이 이렇게 어렵다.
다음 포스트에서는 for문 그리고 if문 마지막으로 배열에 대해서 알아보겠다.
'GuideBook' 카테고리의 다른 글
티스토리에 애드센스(구글광고) 삽입의 모든것 (0) | 2020.01.29 |
---|---|
운동에 대한 동기부여가 필요하신분 자기합리화 금지 (0) | 2020.01.20 |
리눅스 기본 명령어 (0) | 2020.01.17 |
vi 편집기 명령어 (0) | 2020.01.17 |
역사적 변동성 계산방법 (0) | 2019.12.26 |