/
배시 셸 스크팁트 프로그래밍(bash shell script programming)

배시 셸 스크팁트 프로그래밍(bash shell script programming)


For loop 사용

문법

for 문법
for VARIABLE in 1 2 3 4 5 .. N
do
	command1 ${VARIABLE}
	command2 ${VARIABLE}
	commandN ${VARIABLE}
done


in 뒤에 조건문에는 $(COMMAND) 구문으로 명령어 실행 결과를 넣을 수 있음.

세 번 수행하면서 변수 출력

$ for i in 1 2 3;do echo $i;done


외부 명령어 결과 출력

$ for i in $(ls);do echo $i;done


{START..END..INCREMENT} 구문 사용

{ } 구문으로 루프의 조건을 지정할 수 있음. INCREMENT 를 생략할 경우 1 로 설정됨.

1에서 5 까지 출력
for i in {1..5}
do
   echo "Welcome $i times"
done


INCREMENT 지정

1, 3, 5 세 번 실행

1에서 5 까지 출력
for i in {1..5..2}
do
   echo "Welcome $i times"
done


Runtime Parameter 처리

파라미터의 갯수(argc) 는 $# 변수에 담기며 개별 파라미터(argv)는 $숫자 에 저장됨.

$0 은 프로그램 이름(쉘 스크립트명)이 저장되며 $1 부터 파라미터가 저장.

#!/bin/bash


echo "Total Param= $#,  PROG: $0, param1 = $1, param2 = $2";


bash 는 args 배열에 파라미터를 저장하므로 처리가 용이

param.sh
#!bin/bash

## 파라미터가 없으면 종료 
if [ "$#" -lt 1 ]; then
    echo "$# is Illegal number of parameters."
    echo "Usage: $0 [options]"
	exit 1
fi
args=("$@")

## for loop 를 파라미터 갯수만큼 돌리기 위해 three-parameter loop control 사용
for (( c=0; c<$#; c++ ))
do
    echo "$c th parameter = ${args[$c]}";
done


실행 결과

$ ./param.sh
0 is Illegal number of parameters.
Usage: ./p.sh [options]
 
$ ./param.sh first second third
0 th parameter = first
1 th parameter = second
2 th parameter = third


getopt

option 처리 라이브러리인 getopt 가 내장되어 있으므로 런타임 파라미터 작성시 사용하면 가독성에 많은 도움이 됨

 Click here to expand...


compare oper

-eq, -lt 등의 연산자는 integer 비교만 가능하고 문자열 비교는 ==, != 사용

if [ "$a" == "OK" ];then
	//doit
fi


조건문(if-else,elif)

if 문

 ] 안에 test 조건을 넣을 수 있음.

Arithmetic tests

-eq, -ne 등의 연산자 사용 가능

$var 가 0 인지 확인
if [ $var -eq 0 ];then
  echo "\$var is 0";
else
  echo "\$var is not 0";
fi


File test

-d(디렉터리 여부), -f(파일 존재) 등 파일 조건 검사 가능

## /etc/nginx/sites-available/ 디렉터리가 없으면 생성
if [ ! -d "/etc/nginx/sites-available/" ];then
    mkdir /etc/nginx/sites-available/
fi


String test

-z(문자열이 empty), -n(문자열이 none empty) 등

## $var 문자열이 공백인지 검사
if [ -z $var ];then
    echo "\$var is empty";
fi

if 문 안의 이중 대괄호( [[  ]])

bash(ksh, zsh 포함)  의 확장 기능으로   [] 에 비해 다양한 연산자를 사용할 수 있음

정규식

=~ 로 정규식 사용 가능.

#!/bin/bash -x

line='  abcde fg'

if [[ $line =~ [[:space:]]*(abc)?(de)* ]];then
        echo "${BASH_REMATCH[2]}"
fi

File 처리

외부 파일을 입력값으로 사용

파일을 라인별로 읽어서 입력값으로 사용

#!/bin/sh

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "Text read from file: $line"
done < "$1"


Back ground 로 구동

bg 명령어로 백그라운드로 실행시 terminal 이 연결되어 있으므로 logout 하면 종료될 수 있다. 터미널과 연결을 끊어주는 nohup 명령어와 함께 표준입력과 표준 출력을 전환해 주면 로그아웃해도 의도한대로 백그라운드에서 작업이 수행된다.

nohup myprogram > foo.out 2> foo.err < /dev/null &

이제는 nohup 대신 systemd-run 명령어를 권장함.


root 로 실행했는지 여부

EUID 환경 변수 체크

if [ "$EUID" -ne 0 ];then
  echo "Please run as root"
  exit
fi

외부 프로그램 실행 및 결과 확인

실행후 $? 변수를 체크해서 성공 여부 확인

exec "command" "option1" "option2"

if [ $? -ne 0 ];then
    echo "command failed..."
    exit 1
fi



test 명령어 사용

변수 값이 empty 인지  확인

test 의 -z 연산자를 사용하면 변수에 값이 있는지 확인할 수 있음


if [ -z $VAR ]; then
	echo "$VAR is empty";
else
	echo "$VAR has value";
fi;



실행 파일이 존재하는지 확인

bash script 에서 실행 파일이 있는지 여부를 확인하려면 file 연산자를 사용해서 다음과 같이 코딩해야 함.


if [ ! -x "/usr/local/bin/stow" ] && [ ! -x "/usr/bin/stow" ];then
	# do somthing
fi;


하지만 다른 PATH 에 실행 파일이 있을수 있으므로 다음과 같이 실행 파일의 존재 여부를 확인하면 됨.


#!/bin/bash

# 체크 대상 프로그램
PROG=gawk

if ! command -v ${PROG} &> /dev/null; then
    echo "${PROG} not found";
else
    echo "${PROG} is exist";
fi;




같이 보기

Related content

power shell 명령 종료 상태 값(command exit status) 확인
power shell 명령 종료 상태 값(command exit status) 확인
More like this
bash 에서 라인의 시작, 끝으로 가는 단축키가 동작하지 않을 때 처리 방법
bash 에서 라인의 시작, 끝으로 가는 단축키가 동작하지 않을 때 처리 방법
More like this
bash 자동 완성(auto completion) 기능으로 커맨드라인 생산성 높이기
bash 자동 완성(auto completion) 기능으로 커맨드라인 생산성 높이기
More like this
echo 명령어로 줄바꿈(개행) 문자 입력
echo 명령어로 줄바꿈(개행) 문자 입력
More like this
연속된 숫자를 나열하는 linux seq 명령어 사용법
연속된 숫자를 나열하는 linux seq 명령어 사용법
More like this
bash 명령어 히스토리 관리 - readline 사용법 및 line 편집, reverse search 등 단축키 요약
bash 명령어 히스토리 관리 - readline 사용법 및 line 편집, reverse search 등 단축키 요약
More like this