*** Shell Script 작성 시 띄워쓰기 주의
#!
)SheBang(#!
) 은 2Byte의 Magic Number로 스크립트의 맨 앞에서 해당 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에 알려주는 역할을 함
- SheBang이라는 이름은 Hash(#) 또는 Sharp(#) 과 Bang(!) 의 합성어에서 유래됨
사용법
#!<interpreter> [optional-arg]
#!
뒤에 공백(Space)이 하나 있어도 동작함<Interpreter>
에는 프로그램의 절대경로를 입력사용 예시
#!/bin/sh
#!/bin/bash
#!/usr/bin/pwsh
#!/usr/bin/env python3
#!/usr/bin/env bash
프로그램 실행 전 chmod +x <파일명>
로 파일에 실행권한 추가 필요
#!/usr/bin/env
을 사용하는 경우#!/usr/bin/env
로 설정하면 절대경로에 상관 없이 인터프리터의 위치를 찾아서 실행 가능#!/usr/bin/env
를 사용# 권한 추가
$ chmod +x test.sh
# 실행
$ ./test.sh
read
-p
: 프롬프트 메세지를 띄우며 입력을 받을 수 있는 옵션echo
-e
: escape 문자(\
)를 사용하는 옵션-n
: 줄바꿈 없이 출력하는 옵션# 입력
read NAME
read -p "message" name
# 출력
echo "Hello, $NAME!"
echo -e "\033[96mHello, $name!\033[0m" # 출력 색상 바꾸기
변수명=데이터
$변수명
unset 변수명
mysql_id='root'
mysql_directiory='/etc/mysql'
echo $mysql_id $mysql_directory
unset mysql_directiory
변수명=데이터
local 변수명=데이터
export 변수명=데이터
declare
, typeset
타입 지정 명령을 지원# 읽기 전용
# readonly string_variable="hello world" 문법과 동일
declare -r string_variable
# 정수
# number_variable=10 문법과 동일
declare -i number_variable=10
# 배열
# array_variable=() 문법과 동일
declare -a array_variable
# 환경 변수
# export export_variable="hello world" 문법과 동일
declare -x export_variable="hello world"
# 현재 스크립트의 전체 함수 출력
declare -f
# 현재 스크립트에서 지정한 함수만 출력
declare -f 함수이름
HOME
: 사용자의 홈 디렉토리PATH
: 실행 파일을 찾을 경로PWD
: 사용자의 현재 작업중인 디렉토리FUNCNAME
: 현재 함수 이름SECONDS
: 스크립트가 실행된 초 단위 시간PPID
: 부모 프로세스의 PIDBASH
: BASH 실행 파일 경로UID
: 사용자 IDUSERNAME
: 사용자 이름GROUPS
: 사용자 그룹(/etc/passwd
값을 출력)$0
: 쉘 스크립트 이름
$1~$9
: 명령줄 인수
${10}
처럼 {} 사용 필요$*
: 모든 명령줄 인수 리스트
$#
: 인수의 개수
ex) shell.sh
#!/bin/bash
echo $$ $0 $1 $* $#
$ ./shell.sh kkk 222
15249 ./shell.sh kkk kkk 222 2
$$
: 쉘의 프로세스 번호 (pid)$?
: 최근 실행한 명령어의 종료 값$!
: 최근에 실행한 백그라운드(비동기) 명령의 PID$-
: 현재 옵션 플래그$_
: 지난 명령의 마지막 인자로 설정된 특수 변수${변수}
: $변수
와 동일하지만 {}를 사용해야만 동작하는 것들이 있음 (ex. echo ${string}
)${변수:위치}
: 위치 다음부터 문자열 추출${변수:위치:길이}
: 위치 다음부터 지정한 길이 만큼의 문자열 추출${변수:-단어}
: 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수는 사용 불가${변수-단어}
: 변수 미선언시만 기본값 지정, 위치 매개 변수는 사용 불가${변수:=단어}
: 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수 사용 가능${변수=단어}
: 변수 미선언시만 기본값 지정, 위치 매개 변수 사용 가능${변수:?단어}
: 변수 미선언 혹은 NULL일때 단어 출력 후 스크립트 종료${변수?단어}
: 변수 미선언시만 단어 출력 후 스크립트 종료${변수:+단어}
: 변수 선언시만 단어 사용${변수+단어}
: 변수 선언 혹은 NULL일때 단어 사용${#변수}
: 문자열 길이${변수#단어}
: 변수의 앞부분부터 짧게 일치한 단어 삭제${변수##단어}
: 변수의 앞부분부터 길게 일치한 단어 삭제${변수%단어}
: 변수의 뒷부분부터 짧게 일치한 단어 삭제${변수%%단어}
: 변수의 뒷부분부터 길게 일치한 단어 삭제${변수/찾는단어/변경단어}
: 처음 일치한 단어를 변경${변수//찾는단어/변경단어}
: 일치하는 모든 단어를 변경${변수/#찾는단어/변경단어}
: 앞부분이 일치하면 변경${변수/%찾는단어/변경단어}
: 뒷부분이 일치하면 변경${!단어*}, ${!단어@}
: 선언된 변수중에서 단어가 포함된 변수명 추출변수명=(데이터1데이터2데이터3...)
${변수명[인덱스번호]}
daemons=("httpd" "mysqld" "vsftpd") // 변수 선언
echo ${daemons[1]} // $daemons 배열의 두 번째 인덱스에 해당하는 myspld 출력
echo ${daemons[@]} // $daemons 배열의 모든 데이터 출력
echo ${daemons[*]} // $daemons 배열의 모든 데이터 출력
echo ${#daemons[@]} // $daemons 배열의 배열 크기 출력
filelist=( $(ls) ) // 해당 쉘 스크립트 실행 디렉토리의 파일 리스트를 배열로 변수 선언
echo ${filelist[*]} // $filelist 모든 데이터 출력
문자1 = 문자2
또는문자1 == 문자2
: 문자 1과 문자 2가 일치문자1 != 문자2
: 문자 1과 문자 2가 일치하지 않는다.-z 문자
: 문자가 null 이면 참(값이 없으면 true)-n 문자
: 문자가 null 이 아니면 참값1 -eq 값2
: 값이 같음(equal)값1 -ne 값2
: 값이 같지 않음(not equal)값1 -lt 값2
: 값1이 값2보다 작음(less than)값1 -le 값2
: 값1이 값2보다 작거나 같음(less or equal)값1 -gt 값2
: 값1이 값2보다 큼(greater than)값1 -ge 값2
: 값1이 값2보다 크거나 같음(greater or equal)-e 파일명
: 파일이 존재하면 참-d 파일명
: 파일이 디렉토리면 참-h 파일명
: 파일이 심볼릭 링크 파일이면 참-f 파일명
: 파일이 일반파일이면 참-r 파일명
: 파일이 읽기 가능하면 참-s 파일명
: 파일크기가 0이 아니면 참-u 파일명
: 파일이 set-user-id가 설정되면 참-w 파일명
: 파일이 쓰기 가능이면 참-x 파일명
: 파일이 실행 가능이면 참조건1 -a 조건2
: AND조건1 -o 조건2
: OR조건1 && 조건2
: AND조건1 || 조건2
: OR!조건
: NOTtrue
false
if [ 조건 ]
then
명령문
else
명령문
fi
조건문 한줄에 작성하기 : if [ 조건 ]; then 명령문; fi
ex) 디렉토리가 존재하는지 확인하고 없다면 만든 후 디렉토리에 파일 복사하기
backup.sh
#!/bin/bash
if ! [-d bak]; then
mkdir bak
fi
cp *.log bak
참고) 특정 문자열을 포함하는지 비교하는 방법
[[ "$STRING1" == *STRING2* ]]
[[ "$STRING1" =~ STRING2 ]]
case ${string} in
hello) echo "${string}: hello 일때"
;;
wo*) echo "${string}: wo로 시작하는 단어 일때"
;;
s|start) echo "${string}: s 혹은 start 일때"
;;
e|end) echo "${string}: e 혹은 end 일때"
;;
*) echo "${string}: 기타"
;;
esac
break
, continue
사용for 변수 in 변수값1 변수값2 ....
do
명령문
done
while [ 조건문 ]
do
명령문
done
until [ 조건문 ]
do
명령문
done
MyFunction () {
echo "Calling MyFunction"
}
MyParamFunc() {
echo "Calling MyParamFunc p1: $1, p2: $2"
}
#함수 호출
MyFunction
MyParamFunc param1 param2
함수 외부에서 $?
를 통해 return value 읽기
my_function() {
echo "Calling my_function p1: $1, p2: $2"
return 100
}
my_function aaa 123
ret=$?
echo "Return value: $ret"
return value를 변수에 직접 할당
my_function() {
echo 100
}
ret=$(my_function aaa 123)
echo "Return value: $ret"
함수에서 값을 리턴하지 않고 전역 변수에 값을 할당하여 함수 밖에서 사용
my_function() {
echo "Calling my_function p1: $1, p2: $2"
ret=100
}
my_function aaa 123
echo "Return value: $ret"