오늘은 리눅스에서 자주 사용하는 스크립트 문법에 대해서,
총정리해 보겠습니다.
1. Bash shell 사용선언
스크립트의 가장 첫 줄에는 아래와 같은 코드로,
어떤 shell을 사용할지 선언해주는데요.
이를 shebang이라고 부릅니다.
보통, 아래와 같이 bash쉘로 선언해 줍니다.
#!/bin/bash
2. 변수 선언 방법
변수를 선언할 때는 공백 없이 = 기호를 사용합니다.
대신 변수를 사용할 때는 $기호를 앞에 아래와 같이 붙입니다.
#!/bin/bash
name="홍길동"
echo "안녕하세요, $name 님!"
위와 같이, echo 명령어를 이용하면 원하는 문구를 화면에 출력할 수 있습니다.
3. read 명령어로 사용자 입력받기
3-1. 입력받아 변수에 저장하기
사용자로부터 입력을 받아서 변수에 저장할 수도 있는데요.
아래와 같이, read 명령어를 사용하면 되는데요.
사용자의 입력을 기다리고,
입력된 값을 'name'이라는 변수에 저장하는 코드입니다.
read name # 입력값을 name 변수에 저장
아래와 같이 작성하면 echo명령어없이,
프롬프트를 보여주고,
입력받을 수도 있습니다.
read -p "이름: " name # -p 옵션으로 프롬프트 메시지 표시
3-2. 비밀번호 입력받기
입력내용이 표시되지 않도록 비밀번호를 입력받을 수도 있습니다.
read -s password # -s 옵션으로 입력 내용을 숨김
3-3. 예제
아래와 같이 간단하게 사용해서 입력한 내용을 출력해볼 수 있겠습니다.
#!/bin/bash
echo "이름을 입력하세요:"
read name
echo "안녕하세요, $name 님!"
4. 조건문
bash 스크립트에서 조건문은 if, elif, else를 사용해서 작성할 수 있습니다.
4-1. 비교 연산자
조건문에 대해 공부하기 전에,
스크립트에서 사용할 수 있는 비교연산자들에 대해 알아보겠습니다.
제가 많이 사용하는 것은,
'=', '!=', '-eq', '-gt', '-lt' 정도입니다.
- 숫자비교시
- -eq: 같다
- -ne: 다르다
- -gt: 크다
- -lt: 작다
- -ge: 크거나 같다
- -le: 작거나 같다
- 문자열 비교시
- =: 같다
- !=: 다르다
- -z: 빈 문자열인지
- -n: 빈 문자열이 아닌지
- 파일 관련
- -f: 파일이 존재하는지
- -d: 디렉토리인지
- -r: 읽기 권한이 있는지
- -w: 쓰기 권한이 있는지
- -x: 실행 권한이 있는지
4-2. if문
if문은 아래와 같이,
if 다음에 조건을 작성하고 then을 넣은 다음,
실행할 명령어를 작성하고 나서,
if를 거꾸로한 fi로 조건문의 종료를 알립니다.
if [ 조건 ]; then
명령어
fi
파일관련해서 사용할 수 있는 아래의 옵션들을 이용해서,
조건문을 사용할 수 있는데요.
- -f: 주어진 경로에 파일이 존재하고, 그것이 일반 파일인지 확인
- 디렉토리나 특수 파일(소켓, FIFO 등)일 경우에는 거짓(False)을 반환
- -e: 파일이나 디렉토리의 존재여부만 확인
- -d: 디렉토리인지 확인
위의 옵션을 이용해 파일이 있는지 아래와 같이 사용할 수 있습니다.
if [ -f "/etc/passwd" ]; then
echo "passwd 파일이 존재합니다"
fi
-e도 파일또는 디렉토리 사용에 많이 이용됩니다.
if [ -e "/path/to/file" ]; then
echo "파일이 존재합니다."
else
echo "파일이 존재하지 않습니다."
fi
4-2. if-else문
if-else문은 다음과 같이 사용할 수 있는데요.
else를 쓴다는 것 외에는 특별할 것은 없습니다.
if [ "$name" = "admin" ]; then
echo "관리자입니다"
else
echo "일반 사용자입니다"
fi
참고로 스크립트에서 문자열이 같다를 표현할 때는,
"=="이 아니고, "="입니다.
4-3. 종료 상태에 따른 if문
리눅스에서 각 명령어는 실행 후에 종료상태를 변환합니다.
이 상태는 다음 명령어를 통해서 확인할 수 있습니다.
- $?
- 0: 명령어 성공적으로 실행 됨
- 1~255: 명령어 실행 중 오류가 발생함
한번 가장 간단한 'ls'명령어를 실행해 본 후,
아래와 같이 테스트 해보시면 쉽게 값을 볼 수 있습니다.
이제 이런 값을 이용해서 if문을 만들수도 있습니다.
아래와 같이 if문을 이용해,
특정 명령어를 실행한 후,
성공여부에 따른 조건을 넣을 수 있겠지요.
<특정 명령어 실행>
if [ $? -eq 0 ]; then
echo "명령어가 성공적으로 실행되었습니다."
else
echo "명령어 실행 중 오류가 발생했습니다."
fi
$?에 담긴 값을 이용하지 않고,
바로 아래와 같이,
if문을 작성할 수도 있습니다.
if <명령어>; then
echo "성공"
else
echo "실패"
fi
이번에는,
docker-compose를 사용할 때,
nginx설정을 바꾼 후,
다시 시작하는 스크립트를 보겠습니다.
nginx설정파일을 테스트하는 명령어를 조건에 놓고,
실패하면 exit 1이라는 명령어를 이용해 비정상 종료시키고요.
성공하면, nginx를 재시작하는 명령어를 아래와 같이 실행시키는 것 입니다.
echo "Nginx 설정 테스트"
if ! docker-compose exec nginx nginx -t; then
echo "❌ Nginx 설정 테스트 실패"
exit 1
fi
echo "Nginx 재시작"
docker-compose exec nginx nginx -s reload
4-3. if-elif-els문
조건이 하나 더 들어가는 경우는,
elif를 아래와 같이 추가해서 사용하면 됩니다.
echo "숫자를 입력하세요:"
read number
if [ $number -eq 0 ]; then
echo "0입니다"
elif [ $number -gt 0 ]; then
echo "양수입니다"
else
echo "음수입니다"
fi
아래는 elif를 이용해서 나이를 구분한 스크립트입니다.
#!/bin/bash
echo "나이를 입력해주세요:"
read age
if [ -z "$age" ]; then
echo "나이를 입력하지 않았습니다"
elif [ $age -lt 20 ]; then
echo "미성년자입니다"
elif [ $age -lt 65 ]; then
echo "성인입니다"
else
echo "어르신입니다"
fi
5. for문
5-1. 숫자범위 반복
숫자 범위로 반복할 때는 다음과 같이 사용해 주면 됩니다.
do와 done사이에 실행할 명령문을 넣어주면 됩니다.
#!/bin/bash
for i in {1..5} # 1부터 5까지
do
echo "숫자: $i"
done
혹은 아래와 같이 do를 바로 뒤에 붙일수도 있습니다.
#!/bin/bash
for i in {1..5}; do
echo "숫자: $i"
done
5-2. 리스트로 반복하기
다음과 같이 리스트로 for...in문을 사용할 수도 있습니다.
for name in "아론" "애론" "히진"
do
echo "이름: $name"
done
5-3. 예제
위에서 배운 내용들을 사용한 예제들을 보겠습니다.
다음은 오래된 로그파일을 삭제하는 스크립트인데요.
for...in문을 이용해서, /var/log디렉토리 내에서,
확장자가 log인 파일들을 순회합니다.
"$(find "$logfile" -mtime +30)"은 파일의 수정 시간이 30일보다 오래되었는지 확인하는 코드인데요.
그렇다면, 파일을 삭제하도록 하였습니다.
#!/bin/bash
# 30일 이상 된 로그 파일 삭제
echo "30일 이상 된 로그 파일 정리를 시작합니다..."
for logfile in /var/log/*.log
do
if [ -f "$logfile" ] && [ $(find "$logfile" -mtime +30) ]; then
echo "삭제: $logfile"
rm "$logfile"
fi
done
참고로 위에서 사용된,
-mtime은 파일의 수정 시간(modification time)을 기준으로 날짜를 체크하는 find 명령어의 옵션입니다.
"-mtime +N"은 N일보다 더 오래된 파일을 의미합니다.
find /var/log -mtime +30 # 30일보다 더 오래된 파일
6. 함수 정의 및 호출
함수를 정의할 때는 아래와 같이 "()"를 이용해서,
블록과 함께 작성해서 실행할 수 있습니다.
function_name() {
# 함수 내용
echo "함수가 실행되었습니다"
}
다른 표현 방법도 있는데요.
function키워드를 이용하는 것 입니다.
function function_name {
# 함수 내용
echo "함수가 실행되었습니다"
}
파라미터는 아래와 같이 사용하면 됩니다.
$1, $2와 같이 매개변수를 사용할 수 있습니다.
greeting() {
echo "안녕하세요, $1님!" # $1은 첫 번째 매개변수
}
# 함수 호출
greeting "홍길동" # 출력: 안녕하세요, 홍길동님!
리턴값이 필요할 경우는 return이라는 키워드를 아래와 같이 이용해 주면 됩니다.
calculate_sum() {
local num1=$1
local num2=$2
echo $((num1 + num2)) # echo로 결과 반환
return 0 # 성공적인 실행을 의미
}
# 함수 결과 저장
result=$(calculate_sum 5 3)
echo "합계: $result" # 출력: 합계: 8
좀 더 복잡한 예제를 보면 다음과 같습니다.
#!/bin/bash
# 로그 메시지 출력 함수
log_message() {
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$timestamp] $1"
}
# 파일 백업 함수
backup_file() {
local source=$1
local destination="$1.backup"
if [ -f "$source" ]; then
cp "$source" "$destination"
log_message "$source 파일 백업 완료"
return 0
else
log_message "에러: $source 파일이 존재하지 않음"
return 1
fi
}
# 함수 호출
log_message "백업 프로세스 시작"
backup_file "test.txt"
7. 환경변수 파일 사용하기
.env파일은 .gitignore에 포함시켜서 사용하는 환경변수 파일입니다.
아래와 같이 중요한 키 값들을 저장해 놓았다고 가정해 보겠습니다.
DB_HOST=localhost
DB_USER=admin
DB_PASS=secretpassword
API_KEY=abcd1234
이 파일을 스크립트에서 불러와 사용하는 방법이 있습니다.
source 명령어나 .(점) 명령어를 사용하면 되는데요.
아래와 같이 실행하면 됩니다.
source filename
# 또는
. filename
만약 아래와 같이 '.env'파일을 실행하면,
해당 파일의 변수들을 로드하게 됩니다.
# 환경변수 파일 로드
source .env
이렇게 스크립트내에서,
source명령어 사용시,
현재 셸 환경에서 환경변수값들을 쉽게 불러올 수 있습니다.
참고로 .env같이 민감한 파일은,
파일 권한을 제한적으로 설정하는 것이 좋은데요.
아래 명령어로 제한을 할 수 있습니다.
- chmod 600 .env
- 파일 소유자에게만 읽기와 쓰기 권한 부여
- 그룹이나 기타 사용자에게는 권한이 없도록 함
8. 팁 및 주의할 점
8-1. 실행 권한 부여하기
스크립트를 다 작성하고,
실행하기 전에 확인해야 하는 것이 있는데요.
스크립트가 있는 디렉토리에서,
'ls -la' 명령어를 실행해 줍니다.
나오는 기호들의 첫 4자리들은 다음의 의미를 갖고 있는데요.
- -: 파일이면 '-', 디렉토리면 'd'
- r: 읽기 권한
- w: 쓰기 권한
- x: 실행(execute)권한
- 네 번째의 x 자리가 '-'로 나왔다면 실행권한이 없다는 뜻 입니다.
'-rw-r--r--' 처럼 x가 없어서,
실행권한이 없다면,
아래 명령어를 이용해 부여해 주어야 합니다.
chmod +x script.sh
'Linux > Linux 명령어, 스크립트, 설정' 카테고리의 다른 글
실행중인 서버의 IP주소 알아내기: ifconfig (1) | 2024.09.14 |
---|---|
linux 환경변수 설정 방법 정리: Bash 와 Z Shell PATH 및 기본 에디터 변경(Nano) (0) | 2024.04.09 |
Linux 명령어 및 단축키 중 자주 사용하게 되는 것 정리 # 권한변경 (1) | 2024.02.01 |
SCP로 서버에 파일 전송하기: 리눅스 기반 안전한 파일 전송 방법 (1) | 2024.01.31 |
Linux 유저 및 그룹 권한 설정 방법의 모든 것 (0) | 2021.09.30 |
Script를 실행하는 방법:Linux Bash Shell Script (0) | 2020.04.25 |
댓글