기록하는 중/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 홈 디렉터리
MAIL 메일 박스 디렉터리에 해당하는 파일로 보통 /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