Linux

Linux(쉘 스크립트)_2024-08-12

앵보몬 2024. 8. 12. 13:17
728x90
반응형

셸 스크립트 파일

  • 셸 스크립트 파일은 보통 .sh 확장자을 사용합니다.

 

형식

  • 첫 라인에 #!/bin/bash 를 작성해서 bash 를 사용하는 셸 스크립트임을 선언합니다.
#!/bin/bash

echo "Hello World!"

 

주석

  • 주석은 실행되지 않는 텍스트로 셸 스크립트에서는 '#' 기호를 사용합니다.
  • 셸 스크립트는 블록(여러 줄) 단위 주석을 제공하지 않습니다.

 

실행

  • sh script_name.sh 와 같이 실행할 수 있습니다.
  • 스크립트 파일에 실행권한을 부여해 바로 실행할 수 있습니다.
chmod +x script_name.sh
./script_name.sh

 

 

변수선언

  • 변수명은 영문자, 숫자, 밑줄을 사용할 수 있습니다. 하지만 숫자로 시작할 수는 없습니다.
  • 셸 스크립트에서 변수를 선언할 때는 변수명 뒤에 = 연산자를 사용하고, 값을 할당합니다.
  • 공백을 사용하지 않는 것이 중요합니다.
#!/bin/bash

name="Daniel"
age=22

 

변수사용

  • 변수를 사용할 때는 변수명 앞에 $를 붙여 사용합니다.
echo "Name: $name, Age: $age"

 

특별변수

  • 특별변수는 스크립트 실행 시 특정 정보를 제공하는 데 사용되는 변수들입니다. 여기에는 스크립트에 전달된 인자의 수, 스크립트 실행 결과의 상태 코드, 스크립트에 전달된 각 인자 등이 포함됩니다.
$0 스크립트 명
$1..$n $1는 첫 번째 인수, $n은 n 번째 인수
$# 스크립트에 전달된 인자의 총 개수
$* 모든 인자를 하나의 문자열로 취급
$@ 모든 인자를 별도의 문자열로 취급
$? 마지막 명령어의 종료 상태. 0:성공, 그 외 실패
$$ 현재 셸 스크립트의 PID
$! 마지막으로 실행된 백그라운드 PID
  • 사용 예
#!/bin/bash

echo "스크립트 이름: $0"
echo "첫 번째 인자: $1"
echo "인자의 수: $#"
echo "모든 인자 출력: $*"
echo "최근 실행된 명령의 상태 코드: $?"
echo "스크립트의 PID: $$"
echo "백그라운드에서 마지막으로 실행된 작업의 PID: $!"
  • 특별변수 $* 와 $@ 차이 비교용 스크립트
#!/bin/bash

# 한 줄로 출력됨
for arg in "$*"; do
  echo "$arg"
done

# 인자 개수만큼 라인으로 출력됨
for arg in "$@"; do
  echo "$arg"
done

 

환경변수

  • 환경변수는 시스템 정보, 사용자 설정, 시스템 구성 등 다양한 정보를 저장하는 변수입니다
$HOME 현재 사용자의 홈 디렉토리 경로를 나타냅니다.
$PATH 실행 파일을 찾을 디렉토리의 목록을 나타냅니다. 콜론(:)으로 구분됩니다.
$USER 현재 사용자의 사용자 이름을 나타냅니다.
$SHELL 현재 사용자의 로그인 셸을 나타냅니다.
$PWD 현재 작업 디렉토리를 나타냅니다.
$LANG 시스템의 언어 및 지역 설정을 나타냅니다.
$UID 현재 사용자의 사용자 ID를 나타냅니다.
$HOSTNAME 시스템의 호스트 이름을 나타냅니다.
  • 사용 예
echo $HOME
echo $PATH

 

내장 변수 $RANDOM

  • 리눅스 내장변수 $RANDOM 은 0부터 32767 사이의 임의의 숫자를 생성합니다.
  • 이 변수는 스크립트 내에서 난수 생성이 필요할 때 사용할 수 있습니다.
  • 사용 예
echo $RANDOM

0 부터 32767 사이의 임의의 숫자를 출력합니다.

expr $RANDOM % 10 + 1

1 부터 10 사이의 임의의 숫자를 출력합니다.

 

read 명령어

  • read 명령어는 셸 스크립트에서 사용자로부터 값을 입력받아 변수에 저장할 때 자주 사용합니다.
  • 사용 예
#!/bin/bash

read -p "점검할 디렉토리 경로를 입력하세요 : " target_path
echo "$target_path 경로를 점검하겠습니다."

 

 

배열 선언

  • 셸 스크립트는 복잡한 데이터 구조를 사용할 수 없지만 Bash 셸은 최소한의 배열을 지원합니다.
  • 배열은 여러 개의 값을 하나의 변수에 저장할 때 사용됩니다.
  • 배열을 참조할 때는 {} 필요합니다.
#!/bin/bash

app=("httpd" "smb" "mysql" "vsftpd") 

 

배열의 특정 요소에 접근

echo ${app[3]}    #app[3] 해당하는 vsftpd 출력.

 

배열의 모든 요소 출력

echo ${app[@]}    #모든원소 httpd smb mysql vsfptd 출력. 
echo ${app[*]}    #모든원소 httpd smb mysql vsfptd 출력. 

 

배열의 길이

echo ${#app[@]}    #배열크기 4 출력. 

 

배열 요소 추가

app+=("nginx")

 

특정 인덱스의 요소 삭제

unset app[1]    # smb 삭제

https://wikidocs.net/230117

 

쉘 스크립트 예제

#!/bin/bash

#일기 데이터 보존 디렉터리
directory="${HOME}/diary"

#디렉터리가 없으면 생성
if [ ! -d "$directory" ]; then
        mkdir "$directory"
fi

vim "${directory}/$(date '+%Y-%m-%d').txt"
directory="${HOME}/diary"

#디렉터리가 없으면 생성
if [ ! -d "$directory" ]; then
        mkdir "$directory"
fi

#일기 파일의 경로
diaryfile="${directory}/$(date '+%Y-%m-%d').txt"

#일기 파일이 없으면 날짜 정보를 삽입
if [ ! -e "$dairyfile" ]; then
        date '+%Y/%m/%d' > "$diaryfile"
fi

vim "$diaryfile"
#!/bin/bash

list() {
        local filepath=$1

        echo "$filepath"


        if [ -d "$filepath" ]; then
                #디렉토리일 경우 하위 디렉토리와 파일 목록 출력
                local fname
                for fname in $(ls "$filepath")
                do
                        list "$fname"
                done
        fi
}

#함수 호출
"tree.sh" 23L, 274B 

 

728x90
반응형