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 삭제
쉘 스크립트 예제
#!/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
반응형