Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- network
- reactor
- HTTP
- Lombok
- 네트워크
- Java
- 데이터통신
- html
- VCS
- Linux
- NoSQL
- git
- effective
- reactive
- ajax
- cache
- Static
- AWS
- socket
- Elk
- github
- redis
- r
- mybatis
- libuv
- mongodb
- javascript
- spring
- nodejs
- Heap
Archives
- Today
- Total
빨간색코딩
쉘프로그래밍 (shell script, bash) 본문
참조문서 : https://wiki.kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/
1. 출력
- echo : 자동 줄바꿈
- printf : c언어랑 비슷
2. 주석
#!/usr/bin/env bash
#
3. 함수
- function 을 써도되고 생략해도 된다.
- 함수선언이 호출 뒤에있으면 에러가 발생한다. (command not found)
- 에러가 나도 밑에꺼는 마저 실행되는 듯
- 인자 넘기기 : 함수 인자1 인자2 ...
4. 변수
- 변수 할당은 = 앞뒤에 공백이 없어야만 된다. (있으면 command not found 발생)
- 홀따옴표, 쌍따옴표 다 되는 듯
- 선언된 변수는 기본적으로 전역변수이다. 해당 스크립트에서만 유효하다.
- 다른 스크립트(A.sh 내부에서 B.sh 를 호출하는 상황) 에서도 해당 변수를 사용하려면 export 를 붙여 환경변수로 만들어야 한다.
- 함수안에서 선언된 변수 앞에 local 을 붙이면 지역변수가 된다.
- 변수 해제는
unset
으로 한다.
4-1. 변수형
- Bash 는 변수 타입을 구분하지 않고 기본적으로 문자열이다. 다만 문맥에 따라 연산처리를 한다.
4-2. 위치 매개변수
문자 | 설명 | 비고 |
---|---|---|
$0 | 실행된 스크립트명 | |
$1 | 인자 순서대로 번호가 부여된다. 10번째부터는 "{}"감싸줘야 함 | $1 $2 $3...${10} |
$* | 전체 인자 값 | |
$@ | 전체 인자 값 | $*와 동일 |
$# | 매개 변수의 총 개수 |
- 위치 매개변수는 실행인자나 함수인자를 받는데 사용된다.
4-3. 특수 매개변수
문자 | 설명 | 비고 |
---|---|---|
$$ | 현재 스크립트의 PID | |
$? | 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태 | 0=정상종료, 1~255=이상종료 |
$! | 최근에 실행한 백그라운드(비동기) 명령의 PID | |
$- | 현재 옵션 플래그 | |
$_ | 지난 명령의 마지막 인자로 설정된 특수 변수 |
4-4. 확장 매개변수
문자 | 설명 | 비고 |
---|---|---|
${변수} | ||
${변수:위치} | 위치 다음부터 문자열 추출 | |
${변수:위치:길이} | 위치 다음부터 지정한 길이만큼의 문자열 추출 | |
${변수:-기본값} | 변수가 미선언되었거나 null 일때 기본값 지정 | 위치매개변수는 ${변수:=기본값} 사용 |
${변수-기본값} | 변수 미선언시에 기본값 지정 | 위치매개변수는 ${변수=기본값} 사용 |
${변수:?값} | 변수가 미선언되었거나 null 일때 값출력 후 스크립트 종료 | |
${변수?값} | 변수 미선언시에 값 출력 후 스크립트 종료 | |
${#변수} | 문자열 길이 |
5. 커맨드
- 쉘스크립트에서는 $(리눅스 명령어 ..) 의 결과인 표준 출력을 문자열로 치환한다.
- 물론 변수에 할당도 가능하다. ex. today=$(date)
6. 산술 확장
- $((계산식)) : 계산식 안에 있는 숫자들은 문자열이 아니라 숫자로 연산이 된다.
7. 연산자
- 논리 연산자
- 산술 연산자
- 비트 연산자
- 기타 연산자
,
: 2개 이상의 산술 연산을 묶어줌
- 정수 비교
- -eq : 같음
- -ne : 같지 않음
>
, -gt : 크다>=
, -ge : 크거나 같다<
, -lt : 작다<=
, -le : 작거나 같다
- 문자열 비교
- -n : 문자열이 null 이 아닌가
- -z : 문자열이 null 또는 길이가 0이 아닌가
- 대소구분은 ascii 코드 값으로 한다
8. 제어문
- [ 조건문 ] : 뛰어쓰기에 유의하자..
8-1. 반복문
- break
- continue
- while :; do 실행문장 done : 무한반복문
예시
# 지정된 범위 안에서 반복문 필요 시 좋음
for str in "hello" "world"
do
echo ${str}
done
# 수행 조건이 true 일때 실행됨 (실행 횟수 지정이 필요하지 않은 반복문 필요 시 좋음)
num=0
while [ ${num} -le 5 ]
do
echo ${num}
num=$((${num}+1))
done
# 수행 조건이 false 일때 실행됨 (실행 횟수 지정이 필요하지 않은 반복문 필요 시 좋음)
cnt=10
until [ ${cnt} -le 5 ]; do
echo ${cnt}
cnt=$(( ${cnt}-1 ))
done
8-2. 조건문
- 실행할 문장이 없으면 오류가 발생한다.
- 변수는 ""로 감싸주는게 좋다.
- "[: =: unary operator expected" 에러
- if [ 조건 ]; then 실행문장1; else 실행문장2; fi
예시
string1="hello"
string2="world"
if [ ${string1} == ${string2} ]; then
# 실행 문장이 없으면 오류 발생함
# 아래 echo 문장을 주석처리하면 확인 가능함
echo "hello world"
elif [ ${string1} == ${string3} ]; then
echo "hello world 2"
else
echo "hello world 3"
fi
8-3. 선택문
- 정규식을 지원하며 | 기호로 다중 값을 입력 가능하다.
- 조건의 문장 끝에는 ;; 기호로 끝을 표시한다.
- case 선택변수 in
9. 배열
- 배열 변수 사용은 반드시 괄호를 사용해야 한다. ex.
${arr[1]}
- 쉘스크립트는 1차원 배열만 사용한다.
- 배열 초기화 : array=("hello" "redboy" "devljh")
- 배열에 값을 추가할 때는 인덱스가 연결되지 않아도 된다.
- 배열 복사는 array=(${array[@]} "redboy") 와 같이 한다.
- 전체 출력 : ${array[@]}
- 배열 전체 길이 출력 : ${#array[@]}
'Linux' 카테고리의 다른 글
GCP (장단점, 프리티어, VM 생성, SSH 연결, 공인ip, 가격, 선점형, Storage) (1) | 2018.08.19 |
---|---|
rsync (장점, 사용법, 옵션) (0) | 2018.06.26 |
IO모델 (동기vs비동기vs블로킹vs논블로킹) (0) | 2017.08.04 |
프로세스 추적 strace (0) | 2017.08.04 |
ulimit (0) | 2017.08.04 |
Comments