bash 공부
참고한 블로그 : https://engineer-mole.tistory.com/200
기초
# 코멘트이다.
# 코멘트 처리된 구문은 실행되지 않는다.
#! /bin/sh
: 처음 스크립트 작성할 때 시작 부분
ehco로 출력, read로 입력할 수 있다.
read NAME - 입력을 대기한다. 대기하고 있는 경우, 스크립트는 실행되지 않는다.
echo "Hello, $NAME"
Bash에서는 -e 플래그로 특수 텍스트를 이스케이프할 수 있다.
echo "Hello\n$NAME!" # 개행된다.
변수의 이름으로써 영문자, 숫자 그리고 언더바가 사용된다.
변수에 값을 전달할 때는 = 의 앞, 뒤에 공백 없이 작성한다. 문자열인 경우 ""로 감싼다.
var="변수1"
VaR_2="변수2"
변수에 엑세스할 때 변수명의 앞에 $를 넣는다. 혹은 $넣고 변수를 {}로 감싼다.
하나의 변수에 한 개의 값만 보존된다.
echo "Var_2=$VaR_2"
변수의 값이 덮어 쓰기되는 것을 방지하기 위해서는 readonly를 사용한다.
변수를 unset으로 삭제할 수 있다. 그러나 readonly 변수를 삭제하는 것은 불가능하다.
readonly var
var="readonly var를 바꿔보자" # readonly 변수 바꾸려고 한다고 실행 에러 발생
특별한 변수
쉘 스크립트에서는 아래와 같은 특별한 변수가 있다.
변수 | 실행 결과 |
---|---|
$0 | 스크립트 명 |
$1 ~ $9 | 인수, 첫 번째의 인수는 $1, 2번 째의 인수는 $2로 엑세스한다. |
$# | 스크립트에 전달된 인수의 수 |
$* | 모든 인수를 모아서 하나로 처리 |
$@ | 모든 인수를 각각 처리 |
$? | 직전에 실행한 커맨드의 종료 값(0은 성공, 1은 실패) |
$$ | 이 쉘 스크립트의 프로세스 ID |
$! | 마지막으로 실행한 백그라운드 프로세스 ID |
특수문자는 문자열로 사용할 때는 앞에 \를 쓴다.
#!/bin/sh
echo "\$0(스크립트 명): $0"
echo "\$1(1번째 인수): $1"
echo "\$2(2번째 인수): $2"
echo "\$#(인수의 수): $#"
echo "\"\$*\": \"$*\""
echo "\"\$@\": \"$@\""
VAR="exit값은0이 될 것이다."
echo $?
실행 결과
$ ./test.sh first second 3rd $0(스크립트 명): test.sh
$1(1번째 인수): first
$2(2번째 인수): second
$3(3번째 인수): 3rd
$#(인수의 수): 3
"$*": "first second third"
"$@": "first second third"
0
변수 값의 치환
명령어 | 실행 결과 |
---|---|
${var} | 변수 값을 바꿔 넣는다. |
${var:-word} | 변수가 아직 세팅되지 않거나 공백 문자열의 경우 word를 반환한다. var에는 저장되지 않는다.(default 값) |
${var:=word} | 변수가 아직 세팅되지 않거나 공백 문자열의 경우 word를 반환한다. var에 저장된다.(default 값을 저장함) |
${var:?word} | 변수가 아직 세팅되지 않거나 공백 문자열의 경우 치환에 실패하고, 스탠다드 에러에 에러가 표시된다. |
${var:+word} | 변수가 세팅되지 않은 경우 word가 반환된다. var에는 저장되지 않는다. |
test.sh
echo "1 - ${test:-TestWord1}"
echo "2 - test = ${test}"
echo "3 - ${test:=TestWord3}"
echo "4 - test = ${test}"
unset test
echo "5 - ${test:+TestWord5}"
echo "6 - test = ${test}"
test="new Value"
echo "7 - ${var:+TestWord7}"
echo "8 - test = ${test}"
echo "9 - ${test:?ErrorMessage}"
echo "10 - test = ${test}"
실행결과
1 - TestWord1
2 - test =
3 - TestWord3
4 - test = TestWord3
5 -
6 - test =
7 - TestWord7
8 - test = new Value
9 - new Value
10 - test = new Value
배열
#!/bin/bash
# bash shell로 배열을 작성하는 방법
ARRAY=(item1 item2 item3 item4)
ARRAY[0]="ITEM1"
ARRAY[2]="ITEM3"
echo "ARRAY[0]: ${ARRAY[0]}"
echo "ARRAY[1]: ${ARRAY[1]}"
# 모든 아이템에 엑세스하기
echo "ARRAY[*]: ${ARRAY[*]}"
echo "ARRAY[@]: ${ARRAY[@]}"
실행 결과
ARRAY[0]: ITEM1
ARRAY[1]: item2
ARRAY[*]: ITEM1 item2 ITEM3 item4
ARRAY[@]: ITEM1 item2 ITEM3 item4
오퍼레이터
- 연산자
연산자 | 의미 | 예 |
---|---|---|
+ | 덧셈 | echo expr 10 + 20 => 30 |
- | 뺄셈 | echo expr 20 - 10 => 10 |
* | 제곱 | echo expr 11 \* 11 => 121 |
/ | 나눗셈 | echo expr 10 / 2 => 5 |
% | 나머지 | echo expr 10 % 4 => 2 |
= | 자정 | a=$b b의 값은 a에 저장된다 |
== | 동일 | [ 'b' ] $a과 $b가 동일하는 경우 TRUE가 반환된다 |
!= | 다름 | [ 'b' ] $a과 $b가 동일하지 않을 경우 TRUE가 반환된다 |
- 비교
비교 | 의미 | 예 |
---|---|---|
-eq | 동일 | [ "b" ] 와 $a와 $b가 동일한 경우 TRUE가 반환된다 |
-ne | 다음 | [ "b" ] $a와 $b가 동일하지 않은 경우 TRUE가 반환된다 |
-gt | 보다 큼 | [ "b" ] $a가 $b보다 큰 경우 TRUE가 반환된다 |
-lt | 보다 작음 | [ "b" ] $a가 $b보다 작은 경우 TRUE가 반환된다 |
-ge | 보다 크거나 같거나 | [ "b" ] $a가 $b보다 크거나 같은 경우 TRUE가 반환된다 |
-le | 보다 작거나 같거나 | [ "b" ] $a가 $b보다 작거나 같은 경우 TRUE가 반환된다 |
! | (이)가 아니다 | [ ! "b" ]$a가 $b보다 크지 않은 경우 TRUE가 반환된다 |
-o | or | [ "b" -o "b" ]$a가 $b보다 크거나 작은 경우 TRUE가 반환된다. (Bash 확장 / POSIX폐지 예정) |
-a | and | [ "a" -lt 100 ] $a가 90보다 크고 100보다는 작은 경우 TRUE가 반환된다 |
-z | 문자열이 비었는가 | [ -z "$a" ]$a에 어떤 것도 지정되지 않은 경우 TRUE가 반환된다 |
-n | 문자열이 비었는가 | [ -n "$a" ] $a에 어떠한 것이 지정되어 있다면 TRUE가 반환된다 |
if문
- if의 기본 작성법은
if [조건] then 커맨드 fi
이다 - 조건과 일치하는 경우 then 뒤의 커맨드가 실행된다
- 조건과 다른 경우 차례로
elif [조건]
에 적힌 내용을 확인한다 - 일치하는 조건이 없는 경우 else 다음의 커맨드가 실행된 후 종료된다
else가 존재하지 않는 경우, 그대로 종료된다
#!/bin/bash
if [ "$1" -gt "$2" ]
then
echo "1번째 인수가 2번째 인수보다 크다"
elif [ "$1" -eq "$2" ]
then
echo "1번째 인수와 2번째 인수가 동일하다"
else
echo "1번째 인수가 2번째 인수보다 작다"
fi
실행 결과
./test.sh 2 7
1번째 인수가 2번째 인수보다 작다
./test.sh 10 5
1번째 인수가 2번째 인수보다 크다
./test.sh 9 9
1번째 인수와 2번째 인수가 동일하다
Author And Source
이 문제에 관하여(bash 공부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hiyee-gj/bash-공부저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)