기록하는 중/UNIX
[Unix] 셸 스크립트
성장하는 요롱이
2023. 12. 21. 23:27
셸
- 명령어 해석기 : 사용자에게 인터페이스 제공,
- 명령어에 상응하는 프로그램을 실행시키고, 완료 후 결과를 스크린에 보여줌
- 함수, 변수 등의 프로그래밍 요소를 사용할 수 있음
- 반복문, 조건문 등의 제어 구조를 사용할 수 있음
- 셸은 셸 스크립트 프로그램에 있는 명령 행을 제어 구조에 따라 해석하고 실행시킴
- 파일(셸 스크립트)에 명령을 저장하여 자동, 반복적으로 실행 가능
셸의 종류
- Bash 셸(리눅스 배폰판의 기본 셸)
- Csh/Tcsh 셸
- Ksh 셸
- Zsh 셸
- Fish 셸
- 텍스트 모드 또는 GUI 환경에서 터미날을 띄우고 셸 명령을 실행함
셸 스크립트
- 셸 명령어의 집합으로 이루어진 실행 가능한 프로그램(텍스트 파일)
- 셸이 스크립트 파일의 내용을 읽어 처리함
- 선택/반복 등의 프로그래밍 구조를 사용할 수 있음
- 셸에서 사용할 수 있는 모든 기능을 포함할 수 있음(함수, 변수의 선언, 파이프, 입출력 리다이렉션 등)
- 긴 작업, 반복적으로 일어나는 작업을 셸 스크립트로 작성할 수 있음
- 셸 스크립트를 새로운 하나의 명령어처럼 사용할 수 있음
셸 명령의 종류
명령 유형 | 설명 |
에일리어스 | alias 명령을 사용하여 특정 명령을 옵션과 함께 짧은 별칭으로 정의 가능 |
셸 명령어 | 셸에서 예약된 단어로 셸 스크립트 작성 시 사용되는 do, while, case, else 등을 말함 |
함수 | 셸에서 수행 될 수 있는 일련의 명령을 함수로 정의한 것 |
내장 명령 | 셸 내부에 만들어져 잉ㅆ는 명령으로 cd, echo, pwd 등, man builtin을 실행해 보면 내장 명령의 사용법 확인 가능 또는 help builtin-command를 사용하여 확인 가능 |
일반 명령 | 파일 시스템에서 실행 파일로 존재하는 명령 |
셸에서 사용되는 특수 문자
문자 | 의미 |
화이트스페이스 | enter는 명령 행을 종료하고 명령을 실행시킴. Space bar 와 화살표 버튼은 명령 행을 구성하는 요소를 분리하기 위한 것 |
인용부호 | 작은따옴표(' ')와 큰따옴표(" ")는 공백을 포함하는 문자열을 표시할 때나 특별한 의미를 가진 문자를 일반 문자로 처리하기 위해 사용. 역따옴표(' ')는 '명령 치환' 기능 수행. |
백슬래시(\) | 특수 문자 앞에 붙어 특수 문자의 기능을 제거. 이스케이프(escape) 문자라고 함. 긴 명령 행을 연장 할 때도 사용. alias된 명령 앞에 붙으면 alias를 없애줌 |
틸드(~) | ~ 또는 ~username은 사용자의 홈 디렉터리를 의미 |
도트(.) | 현재 작업 디렉터리를 표시 명령 행의 맨 앞에서 사용되면 셸 스크립트를 실행하는 source 명령과 같음 |
더블도트(..) | 현재 디렉터리의 부모 디렉터리를 표시 |
파운드(#) | # 문자의 뒤에 나타나는 문자를 주석으로 처리 |
달러($) | $변수는 변수의 값을 추출 |
앰퍼센트(&) | 명령&는 명령을 백그라운드로 실행시킴 |
애스터리스크(*) | 파일 이름에서 사용할 때는 0개 이상의 임의 문자열과 대응됨 |
물음표(?) | 파일 이름에서 사용할 때 1개 문자와 대응됨 |
세미콜롬(;) | 여러 명령을 순서대로 실행 할 때 구분을 위해 사용함 |
파이프(|) | 왼쪽 명령의 출력을 오른쪽 명령의 입력으로 연결시킴 |
< 또는 > | 입출력 리다이렉션에서, 즉 파일로부터 입력받을 때 또는 파일로 출력할 때 사용함 |
>> | 표준 출력을 파일의 끝에 덧붙일 때 사용함 |
느낌표 | 명령 히스토리 기능을 이용할 때 사용함 |
[ ] | 파일 이름을 지정할 때 대응되는 문자의 범위를 지정함 예를 들어 [0-9]는 숫자 중 1개, [abc]는 a, b, 또는 c 문자 중 1개와 대응됨 |
{ } | 파일 이름을 지정할 때 대응되는 문자의 범위를 지정 예를 들어 {one,two,three}와 {a,b}는 콤마(,)로 구분되는 것 중 하나와 대응됨 |
파이프와 입출력 리다이렉션
작업 | 설명 |
command > file | 표준출력을 지정된 파일로 보냄 |
command 2 > file | 표준오류 출력을 지정된 파일로 보냄 |
command > file 2 > &1 | 표준출력과 표준오류 출력을 지정된 파일로 보냄 |
command < file | 지정된 파일을 표준입력으로 지정하여 읽음 |
command < file.in > file.out | file.in을 표준입력으로 지정하여 읽고 표준출력을 file.out으로 보냄 |
command >> file | 표준출력을 지정된 파일의 끝에 덧붙임 |
command 2 >> file | 표준오류 출력을 지정된 파일의 끝에 덧붙임 |
command >> file 2 > &1 | 표준출력과 표준오류 출력을 지정된 파일의 끝에 덧붙임 |
command << c | 지정된 문자가 나올 때까지 키보드로부터 표준입력을 읽음 |
command1 | command2 | 앞 명령의 결과에서 표준출력을 뒤 명령으로 연결함 |
command1 2 > &1 | command2 | 앞 명령의 결과에서 표준출력과 표준오류 출력을 뒤 명령으로 연결함 |
자주 사용되는 일반적 환경 변수
변수 | 내용 |
BASH | bash 명령의 완전한 경로로 대개 /bin/bash 임 |
HISTCMD | 히스토리 목록에서 가장 최근의 명령을 표시하는 번호임 |
HOME | 홈 디렉터리 |
메일 박스 디렉터리에 해당하는 파일로 보통 /var/spool/mail/username | |
OLDPWD | cd 명령을 사용하기 직전의 작업 디렉토리 |
PATH | 명령을 수행할 때 실행 파일을 찾기 위한 디렉터리 목록 디렉터리는 콜론(:)으로 구분되어 설정 |
PS1 | 셀 프롬프트를 표시하기 위한 문자열 명령어 수행 시 추가로 프롬프트가 필요한 경우 변수 PS2, PS3 등을 설정하여 사용 |
PWD | 현재 작업 디렉터리 |
PPID | 셸의 부모 프로세스 ID |
SHELL | 사용 중인 기본 셸 |
USER | 사용자 계정을 의미하는 이름 |
UID | 현재 사용자의 ID |
IFS | 내부 필드 구분자, 공백 문자, 탭 문자, 개행 문자를 기본값으로 가짐 셸 내장 명령인 read 명령으로 읽은 행을 단어로 분리할 때나 확장 후에 단어를 분리할 때 기준으로 사용하는 문자를 의미함 |
셸 스크립트의 실행 방법
- bash script_file
- bash 명령을 사용하며, 스크립트 파일에 실행권한을 추가할 필요가 없음
- 명령 행에서 script_file 다음에 인수를 추가할 수 있음(모든 방법이 마찬가지)
- 서브 셸을 새로 생성하여 스크립트를 실행함
- ./script_file
- 스크립트 파일의 이름을 명령어처럼 사용하는 방법
- 스크립트 파일에 실행 권한을 추가해야 함
- PATH환경 변수에 설정된 디렉터리에서 스크립트 파일을 찾음
- 스크립트 파일의 첫 행에서 #! 다음에 해석기(/bin/bash)를 지정함
- 서브 셸을 새로 생성하여 스크립트를 실행함
- source script_file 또는 . script_file
- source는 셸의ㅣ 내장 명령이며 현재 사용중인 셸 환경에서 스크립트 파일을 실행 함
- source명령 대신에 도트(.)명령을 사용할 수 있음
셸 스크립트 문법
- # 이후 (같은 행에서) 나오는 내용을 주석으로 처리됨
- $0은 스크립트 파일의 이름으로 확장됨
- source 명령으로 실행하는 경우는 셸의 이름(bash)으로 확장됨
- $1은 첫 번째 인수, $2는 두 번째 인수로 확장됨
- 스크립트가 복잡하다면, 중간중간에 적절한 echo명령을 넣는 것이 좋음
- 변수=값을 사용하여 변수에 값을 지정하고 $변수를 사용하여 값을 추출할 수 있음
- 등호(=)의 좌우에 공백이 있으면 안됨
- 참고 : bash -x script_file과 같이 실행하면 실행 전에 명령 자체가 화면에 출력됨
$cat myScript.sh
#!/bin/bash
echo Hello Linux
echo $0 $1 $2
ls -l $0
$chmod u+x myScript.sh
$./myScript.sh Seoul pusan
Hello Linux
./myScript.sh Seoul pusan
-rwxrw-r--. 1 kdhong kdhong 52 4월 7 20:11 ./myScript.sh
$bash-x myScript.sh Daegu Kwangju
+ echo Hello Linux
Hello Linux
+ echo myScript.sh Deagu Kwangju
myScript.sh Daegu Kwangju
+ ls -l myScript.sh
-rwxrw-r--. 1 kdhong kdhong 52 4월 7 20:11 myScript.sh