Shell Script
#
으로 시작하면 주석인데 #
바로 뒤에 !
가 오면 스크립트를 실행할 쉘을 지정
하는 선언문이다.
주석
# example it's comment!
맨 앞글자에 #
을 붙여주면 된다.
출력
echo "My name is Sung"
printf "Hello World!"
echo
문장을 출력해주는데 python의 print()처럼 자동 줄바꿈이 된다. 변수 출력시에는 앞에 $
을 붙여준다.
printf
C언어와 매우 유사하다. 줄 바꿈이 안 된다.
변수
var1="Apple"
var2="Strawberry"
fuction f(){
local var3="it's Local variable"
echo $var3
}
echo $var1 $var2
printf "local variable : "
f
변수를 사용하려면 앞 뒤 공백 없이 =
를 입력하면 대입연산자가 된다.
그리고 그냥 선언한 변수는 전역 변수
가 된다. 함수 안에서 지역변수
를 사용하려면 변수 이름 앞에 local
을 붙여주면 된다.
함수
function test1(){
echo "It's test1"
}
test2(){
echo "It's test2"
}
test1
test2
함수를 선언할 때 function을 붙여도 되고 안붙여도 상관 없다.
단, 함수 명을 쓰면 함수가 호출이 되는데 호출 코드가 함수 코드보다 반드시 뒤에 있어야 된다. 함수 코드 보다 앞에서 호출 시 오류가 발생한다.
배열
arr=('a' 'b' 'c' 'd')
arr[4]='test'
echo ${arr[4]}
arr[5]='input'
echo ${arr[5]}
echo ${arr[@]}
unset arr
echo ${arr[@]}
배열 사용시에는 괄호를 사용해야한다.
기존 배열에 값을 추가할 수 있고 바꿀 수도 있다.
특정 배열의 함수를 보고싶으면 arr[@] 또는 arr[*]을 사용한다. unset을 이용하면 배열을 지울 수 있다.
참고로 1차원 배열밖에 사용하지 못 한다.
조건문
var1=10
var2=11
if [ ${var1} -eq ${var2} ]; then
echo "var1 Equal var2"
elif [ ${var1} -ne ${var2} ]; then
echo "var1 Not Equal var2"
fi
if문의 기본 형태는 아래와 같다.
값 조건식 값을 넣을 때 띄어쓰기가 안 들어가면 스크립트 에러가 난다.
if
[ 값 조건식 값 ]; then
~~~
fi
조건식 | 설명 |
---|---|
-z | 문자열의 길이가 0이면 참 |
-n | 문자열의 길이가 0이 아니면 참 |
-eq | 값이 같으면 참 |
-ne | 값이 다르면 참 |
-gt | 값1 > 값2 |
-ge | 값1 >= 값2 |
-lt | 값1 < 값2 |
-le | 값1 <= 값2 |
-a | && , And연산과 동일 |
-o | || , xor 연산과 동일 |
선택문
echo "Enter a Num between 1 to 5"
read num
case $num in
1) echo "You pick Number 1" ;;
2) echo "You pick Number 2" ;;
3) echo "You pick Number 3" ;;
4) echo "You pick Number 4" ;;
5) echo "You pick Number 5" ;;
*) echo "Invalid Number" ;;
esac
문장 끝은 ;;
으로 끝내준다. 그리고 case에 없는 값은 *)
을 사용해서 예외 할 수 있다.
반복문
반복문을 빠져 나갈 때 braek
를 사용하고 반복문이나 조건문을 건너 뛸 때는 `continue를 사용한다.
for i in {1..5..2}
do
echo ${i}
done
count=5
for((i=1; i<=count; i++)); do
printf ${i}" "
done
echo ""
i=0
while [ $i -le 5 ]
do
echo $i
i=$(($i+1))
done
for문은 아래와 같은 형식으로 이루어져 있다.
for [변수] in [반복 조건]
do
[실행문]
done
while문은 아래와 같은 형식으로 이루어져있다.
while [ 값1 조건식 값2 ]
do
[실행문]
[실행문]
done
변수 타입
declare -r str_var="Hello"
declare -i num_var=9999
declare -a arr_var=(1 4 'NOP' 10)
declare -x exp_var="export"
func(){
echo "fuction..."
}
declare -f func
echo ${str_var} ${num_var} ${arr_var[*]} ${exp_var}
변수는 타입을 구분하지 않고 기본적으로 문자열이다. 단 문맥에 따라 연산 처리를 한다.
그래서 변수 타입을 지정하기 위해서 declare
, typeset
타입 지정 명령을 지원한다. 옵션은 같다.
-r은 읽기전용 -i는 정수 -a는 배열 -x는 환경 변수 -f는현재 스크립트의 함수 출력을 해준다.
예약 변수
문자 | 설명 |
---|---|
HOME | 사용자의 홈 디렉토리 |
PATH | 실행 파일을 찾을 경로 |
LANG | 프로그램 사용시 기본 지원되는 언어 |
PWD | 사용자의 현재 작업중인 디렉토리 |
FUNCNAME | 현재 함수 이름 |
SECONDS | 스크립트가 실행된 초 단위 시간 |
SHLVL | 쉘 레벨(중첩된 깊이를 나타냄) |
SHELL | 로그인해서 사용하는 쉘 |
PPID | 부모 프로세스의 PID |
BASH | BASH 실행 파일 경로 |
BASH_ENV | 스크립트 실행시 BASH 시작 파일을 읽을 위치 변수 |
BASH_VERSION | 설치된 BASH 버전 |
BASH_VERSINFO | BASH_VERSINFO[0] ~BASH_VERSINFO[5] 배열로 상세정보 제공 |
MAIL | 메일 보관 경로 |
MAILCHECK | 메일 확인 시간 |
OSTYPE | 운영체제 종류 |
TERM | 로긴 터미널 타입 |
HOSTNAME | 호스트 이름 |
HOSTTYPE | 시스템 하드웨어 종류 |
MACHTYPE | 머신 종류(HOSTTYPE 과 같은 정보지만 조금더 상세하게 표시됨) |
LOGNAME | 로그인 이름 |
UID | 사용자 UID |
EUID | su 명령에서 사용하는 사용자의 유효 아이디 값(UID 와 EUID 값은 다를 수 있음) |
USER | 사용자의 이름 |
USERNAME | 사용자 이름 |
GROUPS | 사용자 그룹(/etc/passwd 값을 출력) |
HISTFILE | history 파일 경로 |
HISTFILESIZE | history 파일 크기 |
HISTSIZE | history 저장되는 개수 |
HISTCONTROL | 중복되는 명령에 대한 기록 유무 |
DISPLAY | X 디스플레이 이름 |
IFS | 입력 필드 구분자(기본값: - 빈칸) |
VISUAL | VISUAL 편집기 이름 |
EDITOR | 기본 편집기 이름 |
COLUMNS | 현재 터미널이나 윈도우 터미널의 컬럼 수 |
LINES | 터미널의 라인 수 |
LS_COLORS | ls 명령의 색상 관련 옵션 |
PS1 | 기본 프롬프트 변수(기본값: bash\$ ) |
PS2 | 보조 프롬프트 변수(기본값: > ), 명령을 ""를 사용하여 명령 행을 연장시 사용됨 |
PS3 | 쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #? ) |
PS4 | 쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: + ) |
TMOUT | 0 이면 제한이 없으며 time 시간 지정시 지정한 시간 이후 로그아웃 |
위치 매개 변수
문자 | 설명 |
---|---|
$0 | 실행된 스크립트 이름 |
$1 | $1 $2 $3...${10} 인자 순서대로 번호가 부여된다. 10번째부터는 "{}"감싸줘야 함 |
$* | 전체 인자 값 |
$@ | 전체 인자 값($* 동일하지만 쌍따옴표로 변수를 감싸면 다른 결과 나옴) |
$# | 매개 변수의 총 개수 |
특수 매개 변수
문자 | 설명 |
---|---|
$$ | 현재 스크립트의 PID |
$? | 최근에 실행된 명령어, 함수, 스크립트 자식의 종료 상태 |
$! | 최근에 실행한 백그라운드(비동기) 명령의 PID |
$- | 현재 옵션 플래그 |
$_ | 지난 명령의 마지막 인자로 설정된 특수 변수 |
매개 변수 확장
문자 | 설명 |
---|---|
${변수} | $변수 와 동일하지만 {} 사용해야만 동작하는 것들이 있음 |
${변수:위치} | 위치 다음부터 문자열 추출 |
${변수:위치:길이} | 위치 다음부터 지정한 길이 만큼의 문자열 추출 |
${변수:-단어} | 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수는 사용 불가 |
${변수-단어} | 변수 미선언시만 기본값 지정, 위치 매개 변수는 사용 불가 |
${변수:=단어} | 변수 미선언 혹은 NULL일때 기본값 지정, 위치 매개 변수 사용 가능 |
${변수=단어} | 변수 미선언시만 기본값 지정, 위치 매개 변수 사용 가능 |
${변수:?단어} | 변수 미선언 혹은 NULL일때 단어 출력 후 스크립트 종료 |
${변수?단어} | 변수 미선언시만 단어 출력 후 스크립트 종료 |
${변수:+단어} | 변수 선언시만 단어 사용 |
${변수+단어} | 변수 선언 혹은 NULL일때 단어 사용 |
${#변수} | 문자열 길이 |
${변수#단어} | 변수의 앞부분부터 짧게 일치한 단어 삭제 |
${변수##단어} | 변수의 앞부분부터 길게 일치한 단어 삭제 |
${변수%단어} | 변수의 뒷부분부터 짧게 일치한 단어 삭제 |
${변수%%단어} | 변수의 뒷부분부터 길게 일치한 단어 삭제 |
${변수/찾는단어/변경단어} | 처음 일치한 단어를 변경 |
${변수//찾는단어/변경단어} | 일치하는 모든 단어를 변경 |
${변수/#찾는단어/변경단어} | 앞부분이 일치하면 변경 |
${변수/%찾는단어/변경단어} | 뒷부분이 일치하면 변경 |
${!단어*}, ${!단어@} | 선언된 변수중에서 단어가 포함된 변수 명 추출( |
비트 연산자
문자 | 설명 |
---|---|
<< | 비트 왼쪽 쉬프트(쉬프트 한 번당 2를 곱하는 것과 동일함) |
<<= | left-shift-equal |
>> | 비트 오른쪽 쉬프트(쉬프트 한 번당 2로 나눔) |
>>= | right-shift-equal(<<=와 반대) |
& | 비트 and |
&= | 비트 and-equal |
| | 비트 OR |
|= | 비트 OR-equa |
~ | 비트 negate |
! | 비트 NOT |
^ | 비트 XOR |
^= | 비트 XOR-equal |
기타 연산자
문자 | 설명 |
---|---|
, | 콤마 연산자(comma operator), 2개 이상의 산술 연산을 묶어줌 |
정수 비교
문자 | 설명 |
---|---|
-eq | 같음 |
-ne | 같지 않음 |
> , -gt | 더 큼(> 이중 소괄호에서 사용 가능) |
>= , -ge | 더크거나 같음(>= 이중 소괄호에서 사용 가능) |
< , -lt | 더 작음(< 이중 소괄호에서 사용 가능) |
<= , -le | 더 작거나 같음(<= 이중 소괄호에서 사용 가능) |
문자열 비교
문자 | 설명 |
---|---|
= , == | 같음 |
!= | 같지 않음 |
< | ASCII 알파벳 순서에 더 작음 |
> | ASCII 알파벳 순서에서 더 큼 |
-z | 문자열이 NULL, 길이가 0인 경우 |
-n | 문자열이 NULL이 아님 |
${변수} | 문자열이 NULL이 아님 |
'ShellScript' 카테고리의 다른 글
Shell Script Game v1.0 (0) | 2018.12.02 |
---|