리눅스 마스터 1급 스크립트 문법
오늘은 스크립트 문법에 대해 알아보겠습니다 !!
리눅스 마스터 시험이 너무 어렵읍니다.
모든 프로그래밍 언어가 비슷하듯 일정한 패턴이 존재합니다.
한번 변수 설정부터 살펴보시죠.
1. 변수 (Variables)
쉘 스크립트에서는 변수를 선언하고 사용할 수 있읍니다.
예제 1. 간단한 변수 사용
#!/bin/bash
# 변수 사용 예제
name="Alice"
echo "Hello, $name!"
예제 2. 변수 확장
- 변수 이름: 변수 이름에는 대소문자, 숫자, 언더스코어(_)를 사용할 수 있으며, 숫자로 시작할 수 없습니다.
- 변수 사용: 변수를 참조할 때 $ 기호를 붙여 사용합니다.
- 변수 대입 시 공백: 변수에 값을 할당할 때는 등호(=) 앞뒤에 공백이 없어야 합니다.
변수 확장 (Parameter Expansion)
변수는 다양한 방법으로 확장할 수 있습니다.
- 기본값 설정: 변수에 값이 설정되지 않았을 때 기본값을 사용할 수 있습니다.
- 변수 값 대체: 변수 값이 존재하면 다른 값으로 대체할 수 있습니다.
- 변수 값 길이: 변수의 길이를 구할 수 있습니다.
#!/bin/bash
# 변수 확장 예제
name=${name:+"Alternate Name"}
echo "Name is: $name"
2. 배열 (Arrays)
Bash는 1차원 배열을 지원하며, 숫자 인덱스를 사용하여 배열 요소에 접근합니다.
예제 1. 배열 선언과 접근
#!/bin/bash
# 배열 선언과 접근 예제
fruits=("Apple" "Banana" "Cherry")
echo "First fruit: ${fruits[0]}"
echo "All fruits: ${fruits[@]}"
예제 2: 배열 요소 추가 및 제거
#!/bin/bash
# 배열 요소 추가 및 제거 예제
fruits=("Apple" "Banana" "Cherry")
fruits[3]="Orange"
unset fruits[1]
echo "Fruits after update: ${fruits[@]}"
- 배열 요소 추가: 배열에 요소를 추가할 수 있습니다.
- 배열 요소 제거: unset을 사용하여 배열의 특정 요소를 제거할 수 있습니다.
3. 조건문 (Conditional Statements)
조건문을 사용하여 스크립트의 흐름을 제어할 수 있습니다. Bash에서는 if, else, elif, case 문을 사용합니다.
if-else 문
예제 1: if-else 문
#!/bin/bash
# if-else 문 예제
number=10
if [ $number -gt 5 ]; then
echo "$number is greater than 5"
else
echo "$number is 5 or less"
fi
-
- = : 같음
- != : 같지 않음
- -z : 길이가 0이면 참
- -n : 길이가 0이 아니면 참문자열 비교:
예제 2: case 문
#!/bin/bash
# case 문 예제
day="Monday"
case $day in
"Monday") echo "It's the start of the week." ;;
"Friday") echo "It's almost the weekend!" ;;
*) echo "Just another day." ;;
esac
case 문
case 문은 여러 가지 값을 비교할 때 사용됩니다.
예제 2: case 문
#!/bin/bash
# case 문 예제
day="Monday"
case $day in
"Monday") echo "It's the start of the week." ;;
"Friday") echo "It's almost the weekend!" ;;
*) echo "Just another day." ;;
esac
- *): 다른 조건에 맞지 않는 모든 경우에 실행됩니다.
- ;;: 각 case 블록의 끝을 나타냅니다.
4. 반복문 (Loops)
반복문은 특정 작업을 반복 실행할 때 사용됩니다.
for 문
예제 1: for 문
#!/bin/bash
# for 문 예제
for i in {1..5}; do
echo "Iteration $i"
done
- 문자열 목록: for 루프는 문자열 목록에서도 사용할 수 있습니다.
while 문
예제 2: while 문
#!/bin/bash
# while 문 예제
count=1
while [ $count -le 5 ]; do
echo "Count is $count"
count=$((count + 1))
done
- while [ 조건 ]: 조건이 참일 때까지 반복합니다.
until 문
until 문은 조건이 거짓인 동안 반복합니다.
예제1. until 문을 사용한 카운트다운
#!/bin/bash
# until 문을 사용한 카운트다운 예제
count=5
until [ $count -lt 1 ]; do
echo "Count is $count"
count=$((count - 1))
done
설명: 이 스크립트는 count 변수가 1보다 작아질 때까지 until 루프를 반복하며, 각 반복에서 count 값을 출력한 후 1씩 감소시킵니다. count가 0이 되면 루프가 종료됩니다.
예제2. 사용자 입력에 따른 반복 종료
#!/bin/bash
# until 문을 사용한 사용자 입력 처리 예제
user_input=""
until [ "$user_input" = "yes" ]; do
echo "Please type 'yes' to exit the loop:"
read user_input
done
echo "You typed 'yes'. Exiting loop."
설명: 이 스크립트는 사용자가 "yes"를 입력할 때까지 until 루프를 반복합니다. 사용자가 "yes"를 입력하면 루프가 종료되고 메시지가 출력됩니다.
5. 함수 (Functions)
함수는 반복되는 코드를 재사용 가능하게 만듭니다.
예제 1: 간단한 함수 정의와 호출
#!/bin/bash
# 함수 정의 및 호출 예제
function greet {
echo "Hello, $1!"
}
greet "Alice"
greet "Bob"
- 함수 정의: 함수는 function 키워드 없이 이름 뒤에 ()를 사용하여 정의됩니다.
- 매개변수: 함수 내에서 $1, $2 등을 사용하여 매개변수를 참조합니다.
반환값
Bash 함수는 return을 사용해 반환값을 설정할 수 있지만, 숫자만 반환할 수 있습니다.
예제 2: 함수에서의 반환값 사용
#!/bin/bash
# 함수에서 반환값 사용 예제
function sum {
return $(($1 + $2))
}
sum 3 4
result=$?
echo "The sum is $result"
- $?: 마지막으로 실행된 명령어의 종료 상태를 나타냅니다.
6. 입력과 출력 (Input and Output)
쉘 스크립트에서 파일의 내용을 읽거나 출력할 수 있습니다.
표준 입력
예제 1: 사용자 입력 받기
#!/bin/bash
# 사용자 입력 받기 예제
echo "Enter your name: "
read name
echo "Hello, $name!"
- read: 사용자 입력을 받아 변수에 저장합니다.
예제 2: 파일 읽기
#!/bin/bash
# 파일 읽기 예제
while IFS= read -r line; do
echo "$line"
done < "example.txt"
- IFS: 내부 필드 구분자(Internal Field Separator)로, 기본적으로 공백이나 탭이 사용됩니다.
- 파일에서 읽기: < "filename.txt"를 통해 파일에서 입력을 읽습니다.
7. 파일 및 디렉토리 테스트 (File and Directory Tests)
쉘 스크립트는 파일과 디렉토리의 상태를 검사할 수 있습니다.
예제 1: 파일 존재 여부 확인
#!/bin/bash
# 파일 존재 여부 확인 예제
filename="example.txt"
if [ -e $filename ]; then
echo "$filename exists."
else
echo "$filename does not exist."
fi
- 파일 테스트 연산자:
- -e : 파일이 존재하는지 확인
- -f : 파일인지 확인
- -d : 디렉토리인지 확인
- -r : 읽기 권한이 있는지 확인
- -w : 쓰기 권한이 있는지 확인
- -x : 실행 권한이 있는지 확인
예제 2: 디렉토리 여부 확인
#!/bin/bash
# 디렉토리 여부 확인 예제
directory="mydir"
if [ -d $directory ]; then
echo "$directory is a directory."
else
echo "$directory is not a directory."
fi
8. 명령어 대체 (Command Substitution)
명령어 대체는 명령어의 출력을 변수에 저장하거나 다른 명령어의 인수로 사용할 수 있게 합니다.
예제 1: 명령어 출력을 변수에 저장
#!/bin/bash
# 명령어 출력을 변수에 저장 예제
current_time=$(date)
echo "The current date and time is: $current_time"
- $(command): 명령어의 출력을 캡처하여 변수에 저장합니다.
- 백틱(`): 명령어 대체의 구식 방법이지만 여전히 사용됩니다.
설명: date 명령어의 출력을 current_time 변수에 저장하고 출력합니다.
예제 2: 백틱을 사용한 명령어 대체
#!/bin/bash
# 백틱을 사용한 명령어 대체 예제
hostname=`hostname`
echo "The hostname of this machine is: $hostname"
설명: 백틱(``)을 사용하여 hostname 명령어의 출력을 변수에 저장하고 출력합니다.
9. Here 문서 (Here Documents)
Here 문서는 입력을 파일 대신 스크립트 내에서 직접 제공할 수 있게 합니다.
예제 1: Here 문서 사용하기
#!/bin/bash
# Here 문서 사용 예제
cat <<EOF
This is a multi-line
text example using
Here Document.
EOF
설명: Here 문서를 사용하여 여러 줄의 텍스트를 cat 명령어로 출력합니다.
- <<EOF: EOF라는 구분자까지 입력을 받아들이고, 이를 명령어에 전달합니다.
- EOF: 구분자는 임의로 지정할 수 있으며, 여기서는 EOF가 사용되었습니다.
예제 2: Here 문서로 스크립트에 입력 제공
#!/bin/bash
# Here 문서로 스크립트에 입력 제공 예제
read -r -d '' text <<EOF
Line 1
Line 2
Line 3
EOF
echo "$text"
10. 트랩 (Trap)
trap 명령어는 스크립트가 종료되거나 중단될 때 특정 명령어를 실행하도록 설정할 수 있습니다.
예제 1: SIGINT 신호 처리
#!/bin/bash
# SIGINT 신호 처리 예제
trap "echo 'Interrupt signal received! Exiting...'; exit" SIGINT
echo "Running script... Press Ctrl+C to interrupt."
while true; do
sleep 1
done
- trap: 특정 신호를 감지하여 지정된 명령어를 실행합니다.
- SIGINT: 사용자가 Ctrl+C를 눌렀을 때 발생하는 신호입니다.
예제 2: 스크립트 종료 시 처리
#!/bin/bash
# 스크립트 종료 시 처리 예제
trap "echo 'Cleaning up...'; rm -f temp_file.txt" EXIT
echo "Creating a temporary file..."
touch temp_file.txt
echo "Exiting script."
exit
설명: trap 명령어를 사용해 스크립트가 종료될 때 임시 파일을 삭제합니다.
11. 스크립트 인수 처리 (Command-line Arguments)
쉘 스크립트는 명령행 인수를 처리할 수 있습니다.
예제 1: 인수 출력
#!/bin/bash
# 인수 출력 예제
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
• 설명: 스크립트의 이름과 첫 번째, 두 번째 인수를 출력합니다.
- $0: 스크립트 이름을 나타냅니다.
- $1, $2, ...: 첫 번째, 두 번째 인수를 나타냅니다.
- $@: 모든 인수를 나타냅니다.
- $#: 전달된 인수의 개수를 나타냅니다.
예제 2: 모든 인수와 인수 개수 출력
#!/bin/bash
# 모든 인수와 인수 개수 출력 예제
echo "All arguments: $@"
echo "Number of arguments: $#"
12. 고급 기능 (Advanced Features)
명령어 그룹화
명령어를 그룹화하여 함께 실행할 수 있습니다.
예제 1: 명령어 그룹화
#!/bin/bash
# 명령어 그룹화 예제
{
echo "First command"
echo "Second command"
} > output.txt
- 중괄호 {}: 명령어를 그룹화하여 하나의 블록으로 실행합니다.
- 소괄호 (): 하위 셸에서 명령어를 실행합니다.
예제 2: 모든 인수와 인수 개수 출력
#!/bin/bash
# 모든 인수와 인수 개수 출력 예제
echo "All arguments: $@"
echo "Number of arguments: $#"
설명: 모든 인수와 인수의 개수를 출력합니다.
예제 3: 프로세스 대체
#!/bin/bash
# 프로세스 대체 예제
diff <(ls dir1) <(ls dir2)
- <(command): 명령어의 출력을 파일처럼 사용합니다.
13. 디버깅 (Debugging)
쉘 스크립트를 디버깅하기 위해 -x 옵션을 사용할 수 있습니다.
예제 1: 전체 스크립트 디버깅
#!/bin/bash -x
# 전체 스크립트 디버깅 예제
echo "This is a test"
- -x 옵션: 각 명령어가 실행되기 전에 명령어를 출력합니다.
예제 2: 특정 부분 디버깅
#!/bin/bash
# 특정 부분 디버깅 예제
set -x
echo "Debugging enabled"
set +x
echo "Debugging disabled"
또한, 스크립트 내에서 특정 부분만 디버깅하기 위해 set 명령어를 사용할 수 있습니다.
- set -x: 디버깅을 켭니다.
- set +x: 디버깅을 끕니다.
14. 예외 처리 (Error Handling)
쉘 스크립트에서 예외를 처리하고, 오류가 발생했을 때 적절한 조치를 취할 수 있습니다.
예제 1: 오류 발생 시 스크립트 종료
#!/bin/bash
# 오류 발생 시 스크립트 종료 예제
set -e
if [ ! -d "/nonexistent_directory" ]; then
echo "Directory does not exist"
exit 1
fi
- set -e: 명령어가 실패하면 스크립트를 종료합니다.
- exit: 스크립트를 종료하고 종료 상태 코드를 반환합니다.
예제 2: 사용자 정의 오류 메시지
#!/bin/bash
# 사용자 정의 오류 메시지 예제
filename="example.txt"
if [ ! -e "$filename" ]; then
echo "Error: $filename not found."
exit 1
fi
설명: 파일이 존재하지 않을 경우 사용자 정의 오류 메시지를 출력하고 스크립트를 종료합니다.
이로써 기본 문법은 마치도록 하겠습니다.