Linux/기본기능과 명령어

배시(bash) 셸 프로그래밍

blackbearwow 2024. 1. 26. 14:18

1. 셸 스크립트

- 셸 스크립트 실행방법

bash testScript

셸의 인자로 넘겨 실행하는 방법

./testScript

자체적으로 실행하는 방법

 

- #! 매직넘버

유닉스는 파일 확장자를 붙이지 않는 것이 관례이기 때문에, 어떤 프로그램(인터프리터)로 해당 파일을 실행할지 애매할 수 있다. 이때 파일 맨 첫번째 줄에 #!<인터프리터 경로명>를 붙이면 해당 인터프리터로 파일을 실행시키라는 의미이다.

#!/usr/bin/bash를 붙이면 bash로 해당 파일을 실행시킨다.

- 주석

해당줄 맨 앞에 #을 붙이면 주석 처리된다.

2. 셸 변수

변수 표현

${name} name 값
${name:-word} name이 정의되어있으면 그 값, 아니라면 word에 명시된 값
${name:=word} name이 정의되어있지 않거나 널이라면 word에 명시된 값. name의 값은 word로 저장된다.
${name:+word} name이 정의되어 있고 널이 아니라면 word값. name에 word가 반영되지는 않는다.
${name:?word} name이 정의되어 있고 널이 아니라면 그 값, 아니라면 word값을 출력하고 셸을 종료한다.

명령행 인자

명령행 인자 의미
$0 셸 스크립트 이름
$1 - $9 명령행에 주어진 1 ~ 9번 포지션 인자
${10} 10번째 포지션 인자
$# 전체 포지션 인자 개수
$* 모든 포지션 인자
$@ $*와 같지만 큰 따옴표로 묶으면 달라짐
"$*" "$1 $2 $3"으로 하나의 물자열로 취급
"$@" "$1" "$2" "$3"으로 각각 독립적인 문자열로 취급
$? 최근 실행된 명령의 종료 값
set -- 모든 포지션 인자들을 삭제하거나 설정을 해지함

인용 부호

작은 따옴표(' ') 모든 특수 문자들이 해석되는것을 막는다.
큰 따옴표(" ") 변수나 명령의 대체는 허용하지만 기타 특수 문자들이 해석되는 것은 막는다.
역슬래시(\) 단일 문자가 해석되는 것을 막는다. 

명령 대체

echo `date`
echo $(date)

명령의 출력을 변수로 지정하여 사용하는것. 백 쿼터(`)를 사용하여 명령을 대체한다.

위 명령 둘다 2024. 01. 27. (토) 03:37:03 KST 출력.

3. 입력

read의 사용 형식 의미
read x stdin에서 항 행을 입력 받아 x에 저장
read first last stdin에서 항 행을 입력 받아 첫 번째 단어를 first에 저장하고 나머지를 last에 저장
read -p prompt prompt를 출력시키고 입력을 기다림. 입력된 값은 REPLY 변수에 저장

4. 연산자

((  ))을 사용하는 것을 기본으로 하고, 생략 가능한 연산들이 있다.

또는 let 내장 명령을 사용 가능하다. 하지만 let을 쓸 때는 공백이 포함되면 " "로 묶어야된다.

연산자 의미 예시
- 음수(단항 연산) x=-5
! 논리 부정(not) (( !x < y ))
~ 비트 반전(not) ~y
*,/,% 곱셈, 나눗셈, 나머지 연산 let y=3*5
+,- 덧셈, 뺄셈 let x=x+1
<<,>> 비트 왼쪽 시프트, 오른쪽 시프트 ((y=x<<2))
<=,>=,<,>,==,!= 비교 연산 ((x<y))
&,^,\ 비트 AND, XOR, OR연산 let "z=x^y"
&&,|| 논리 AND, OR ((x<y||x==3))
= 변수값 지정 let z=1
*=,/=,%=,+=,==,<<=,>>=,&=,^=,!= 단축 연산 let z+=1

bash에서의 실수 연산 ↓

더보기

bash에서는 정수만 연산이 가능하고 실수 연산은 불가능하다.

실수 연산을 하고싶을 때는 bc나 awk를 사용하면 된다.

 

bc 사용법: 산술식 뒤에 파이프라인으로 계산식을 넘겨 사용한다. 기본적으로 정수가 결과로 나오지만, -l 옵션을 붙이면 실수로 결과값이 나온다.

#!/usr/bin/bash
a=4; b=3
result=`echo "$a/$b"|bc -l`
echo $result

결과:

$ ./test.sh
1.33333333333333333333

 

awk는 파일로부터 레코드를 선택하고, 선택된 레코드에 포함된 값을 조작하거나 데이터화하는 것을 목적으로 사용하는 프로그램이다. 이걸 쉘에서는 텍스트 데이터를 파이프라인으로 넘겨받아 패턴 매칭 여부 검사, 데이터 조작 및 연산을 할 수 있다. 특정 필드를 파라미터로 사용할 수 있다(space, tab으로 구분됨). 

 

#!/usr/bin/bash
echo `free | grep Mem | awk '{print $1,$2,$3,$4}'`

결과 : Mem: 32780880 2379924 26878476

#!/usr/bin/bash
#남은 메모리 용량 퍼센트
echo `free | grep Mem | awk '{print $4/$2*100'}`

결과: 81.9728

 

5. 제어문

생략 가능한 문법은 <>로 묶었다.

- if ~ else ~ then 문

if [ 조건 ]
then
	명령
<else 
	명령>
fi

또는 

if [ 조건 ]; then 명령; <else 명령;> fi

 

- if ~ then ~ elif ~ else 문

if [ 조건1 ]
then
	명령
elif [ 조건2 ]
then
	명령
<else
	명령>
fi

또는

if [ 조건1 ] 명령; then 명령; elif [ 조건2 ] 명령; then 명령; <else 명령;> fi

 

- for문

for 변수 in list
do
	명령
done
#예시
for ((i=0;i<=9;i++))
do
	echo $i
done

 

- while문

while [ 조건 ]
do
	명령
done

 

- until문

until [ 조건 ]
do
	명령
done

 

- select문

select [ 조건 ]
do
	명령
done

 

- continue, break

continue는 반복문 안에서 사용되어 아래 명령을 실행하지 않고 다시 반복문의 처음으로 돌아간다.

break는 반복문 안에서 사용되어 반복문을 즉시 빠져나간다.

for, while, unitl, select에서 continue, break를 사용할 수 있다.

6. 함수

- 함수의 정의

function func_name
{
	명령들
	<return 리턴값>
}

7. 디버깅

'Linux > 기본기능과 명령어' 카테고리의 다른 글

grep, egrep, fgrep, find  (0) 2024.03.18
스케줄 관리(cron, crontab)  (1) 2024.01.27
셸 변수와 환경 변수  (1) 2024.01.26
man 명령  (0) 2024.01.25
debian 이란?  (0) 2023.03.17