본문 바로가기
자격증/리눅스마스터 1급

리눅스 마스터 1급 스크립트 문법

by CodeMuscle 2024. 8. 20.
반응형

오늘은 스크립트 문법에 대해 알아보겠습니다 !! 

 

 

리눅스 마스터 시험이 너무 어렵읍니다.

모든 프로그래밍 언어가 비슷하듯 일정한 패턴이 존재합니다.

한번 변수 설정부터 살펴보시죠.

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

설명: 파일이 존재하지 않을 경우 사용자 정의 오류 메시지를 출력하고 스크립트를 종료합니다.

 

이로써 기본 문법은 마치도록 하겠습니다.

반응형