자격증/리눅스마스터 1급

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

CodeMuscle 2024. 8. 20. 20:29
반응형

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

 

 

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

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

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

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

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

 

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

반응형