Shell Script

#!/bin/sh
#!/bin/bash
#!/bin/zsh

#으로 시작하면 주석인데 # 바로 뒤에 ! 가 오면 스크립트를 실행할 쉘을 지정하는 선언문이다.

주석

# example it's comment!

맨 앞글자에 # 을 붙여주면 된다.

출력

#!/bin/bash
echo "My name is Sung"
printf "Hello World!"

echo

문장을 출력해주는데 python의 print()처럼 자동 줄바꿈이 된다. 변수 출력시에는 앞에 $ 을 붙여준다.

printf

C언어와 매우 유사하다. 줄 바꿈이 안 된다.

변수

#!/bin/bash
var1="Apple"
var2="Strawberry"

fuction f(){
local var3="it's Local variable"
echo $var3
}
echo $var1 $var2
printf "local variable : "
f

변수를 사용하려면 앞 뒤 공백 없이 = 를 입력하면 대입연산자가 된다.

그리고 그냥 선언한 변수는 전역 변수가 된다. 함수 안에서 지역변수를 사용하려면 변수 이름 앞에 local을 붙여주면 된다.

함수

#!/bin/bash
function test1(){
   echo "It's test1"
}
test2(){
echo "It's test2"
}
test1
test2

함수를 선언할 때 function을 붙여도 되고 안붙여도 상관 없다.

단, 함수 명을 쓰면 함수가 호출이 되는데 호출 코드가 함수 코드보다 반드시 에 있어야 된다. 함수 코드 보다 앞에서 호출 시 오류가 발생한다.

배열

#!/bin/bash
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차원 배열밖에 사용하지 못 한다.

조건문

#!/bin/bash
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 연산과 동일

선택문

#!/bin/bash
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를 사용한다.

#!/bin/bash
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

변수 타입

#!/bin/bash
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
BASHBASH 실행 파일 경로
BASH_ENV스크립트 실행시 BASH 시작 파일을 읽을 위치 변수
BASH_VERSION설치된 BASH 버전
BASH_VERSINFOBASH_VERSINFO[0]~BASH_VERSINFO[5]배열로 상세정보 제공
MAIL메일 보관 경로
MAILCHECK메일 확인 시간
OSTYPE운영체제 종류
TERM로긴 터미널 타입
HOSTNAME호스트 이름
HOSTTYPE시스템 하드웨어 종류
MACHTYPE머신 종류(HOSTTYPE과 같은 정보지만 조금더 상세하게 표시됨)
LOGNAME로그인 이름
UID사용자 UID
EUIDsu 명령에서 사용하는 사용자의 유효 아이디 값(UIDEUID 값은 다를 수 있음)
USER사용자의 이름
USERNAME사용자 이름
GROUPS사용자 그룹(/etc/passwd 값을 출력)
HISTFILEhistory 파일 경로
HISTFILESIZEhistory 파일 크기
HISTSIZEhistory 저장되는 개수
HISTCONTROL중복되는 명령에 대한 기록 유무
DISPLAYX 디스플레이 이름
IFS입력 필드 구분자(기본값: - 빈칸)
VISUALVISUAL 편집기 이름
EDITOR기본 편집기 이름
COLUMNS현재 터미널이나 윈도우 터미널의 컬럼 수
LINES터미널의 라인 수
LS_COLORSls 명령의 색상 관련 옵션
PS1기본 프롬프트 변수(기본값: bash\$)
PS2보조 프롬프트 변수(기본값: >), 명령을 ""를 사용하여 명령 행을 연장시 사용됨
PS3쉘 스크립트에서 select 사용시 프롬프트 변수(기본값: #?)
PS4쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: +)
TMOUT0이면 제한이 없으며 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

+ Recent posts