쉘스크립트 기본


스크립트 실행권한주기

chmod 755 DiskUsageCheck.sh


쉘 스크립트의 첫번째 라인 : 어떤 쉘을 이용하여 이 프로그램을 실행시킬 것인지를 지정하는 것
스크립트가 실행되면 /bin/sh 프로그램 하에서 실행됨을 의미한다.
#!/bin/sh

변수
그냥 변수명을 적으면 된다
변수에 값을 할당하지 않아도 특별한 문제는 발생하지 않으며, NULL로 초기화하고 나중에 값을 할당하려고 한다면 다음과 같이 한다.
name=

변수에 값을 할당할 때는 = 기호를 사용하는데 = 좌우에 공백을 넣으면 안된다.
name=JUNGJH            # 맞다.
name = JUNGJH          # 틀리다.
만일 입력하려는 이름에 공백이 있다면 다음처럼 한다.
name="JUNG J H"

만일 인수로 입력되는 값이 있을 때 이를 변수로 받는 방법은 $숫자 이다, $1은 첫번째 인수이고 $2는 두번째 인수이다.

변수의 내용을 출력하려면 echo를 사용한다이때 변수임을 알리기 위해서 $를 넣는다.
echo $name
echo ${name}

변수에 와일드 문자를 넣어서 사용할 수도 있다.
filename=*.sh
echo $filename   # 확장자가 sh 되어 있는 파일들의 목록이 나온다.

스크립트 파일 내부에서 개발자가 unset 키워드로 변수를 제거할 수 있다.
name="Jung JH"
unset name
newname=$name          # newname=    같다.

쉘 스크립트에서도 상수를 만들 수 있다이때 사용되는 키워드는 readonly이다.
readonly만 쓰면 읽기전용으로 된 상수들을 모두 화면에 표시한다.
Name="Jung JH"
readonly name          #  후로는 값을 바꿀  없다.


쉘 스크립트에서는 쉘 전체가 사용하는 환경변수도 일반 변수와 똑 같은 방법으로 사용할 수 있다.

변수에 값을 할당할 때 입력줄에서 입력받은 내용을 할당하는 방법이 있다스크립트가 실행되는 중간에 변수에 할당할 내용을 사용자로부터 입력받은 후 그 내용을 할당하는 것이다.
이때 사용하는 키워드가 read인데 이 키워드와 변수를 함께 적으면 그 라인이 실행될 때 사용자로부터 입력할 것을 요청하게 된다.
<Grep.sh>
#!/bin/sh
echo "grep 사용될 옵션 입력, -l 또는 -s 입력해주세요."
read option1
echo "검색하고자 하는 문장을 입력해주세요"
read option2
grep $option1 $option2 *

쉘에서 사용되는 특정 키워드는 다음과 같다.
$#   - 명령입력 라인에서 입력된 인수의 개수를 가지고 있다.
$*   - 명령입력 라인에서 입력된 전체의 내용을 포함한다, $1 ~ $n을 모두 합친것과 같다.
$$   - 쉘 프로그램이 실행되면서 사용된 프로세스의 ID 값을 가진다.
$!    - 쉘 프로그램이 실행시킨 백그라운드 프로세스의 ID 값을 가진다.

쉘에서 변수를 사용할 때 변수에 값을 할당된 경우에는 변수가 가진 값을 사용하고그렇지 않으면 디폴트의 다른값을 활용하는 방법이 있다
더 나아가 지정한 내용을 값이 할당되지 않은 변수속에 할당하는 방법도 있다.
${X:-Y}   # X 값이 있으면 그대로그렇지 않으면 Y 사용, X 변동없음
${X:=Y}   # Y 사용되고   X Y 할당
${X:?에러메시지}  # X 값이 없으면 에러메시지와 함께 종료

제어문(조건문)
쉘에서 명령어들을 순차적으로 실행할 때 || 연산자와 && 연산자를 이용하여 연산자 바로 뒤에 위치한 명령어가 조건에 따라 실행되도록 만들 수 있다.
'|| 연산자는 앞의 명령어가 실패했을 때만 뒤에 위치한 프로그램이 실행되도록 한다.
&& 연산자는 반대로 앞의 명령어가 성공적으로 수행되었을 때만 뒤의 프로그램이 실행된다.

다음은 명령어 실행이 실패했을 때 이 내용을 로그로 남기는 작업이다.
Run Command1 || echo 첫번째 명령 실행 실패 >> log.txt
Run Command2 || echo 두번째 명령 실행 실패 >> log.txt
또한 다음은 실패가 예상되는 명령에 대한 보완 실행이다.
ShellTest5.sh || chmod 755 ShellTest5.sh && ShellTest5.sh

If-else 구문의 형식은 다음과 같다.
반드시 대괄호와 조건 사이에 공백이 있어야 한다.
if [ conditons ]
then
   실행하고자 하는 문장
fi

#########
if [ conditons ]
then
   조건만족시 실행하고자 하는 문장
else
   조건 불만족시 실행하고자 하는 문장
fi

##########
if [ conditons ]
then
   조건만족시 실행하고자 하는 문장
elif [ conditons ]
   두번째 조건 만족시 실행 문장
else
   조건 불만족시 실행하고자 하는 문장
fi

if 조건문에서 사용되는 연산자들에는 다음과 같은 것들이 있다.

l         문자열체크
[ stringName ] - 문자열이 널(NULL)인지 체크, Null이 아니면 참
[ -n stringName ]문자열의 사이즈가 0 이상인지 체크,이상이면 참
[ -z stringName ]문자열의 사이즈가 0 인지 체크, 0이면 참
[ stringNameA = stringNameB ] - A문자열과 B문자열이 같은지 체크같으면 참
[ stringNameA != stringNameB ] - A문자열과 B문자열이 다른지 체크다르면 참

l         숫자 대소 관계 체크
[ intA -ge 100 ] - 숫자 A 100보다 크거나 같은지 체크, 100 이상이면 참
[ intA -gt 100 ] - 숫자 A 100보다 큰지 체크, 100이 넘으면 참
[ intA -le 100 ] - 숫자 A 100보다 작거나 같은지 체크, 100 이하이면 참
[ intA -lt 100 ] - 숫자 A 100보자 작은지 체크, 100 미만이면 참

l         파일 체크
[ -r filename ] - 해당 파일이 읽기 가능한지 체크
[ -w filename ] - 해당 파일이 쓰기 가능한지 체크
[ -x filename ] - 해당 파일이 실행 가능한지 체크
[ -s filename ] - 해당 파일의 사이즈가 제로 이상인지 체크
[ -d filename ] - 해당 파일이 디렉토리 파일인지 체크
[ -f filename ] - 해당 파일이 보통 파일인지 체크
[ -h filename ] - 해당 파일이 링크 파일인지 체크

l         조건문의 결합
조건문A -a 조건문B ] - 조건문 A B가 모두 참인지 체크, -a AND
조건문A -o 조건문B ] - 조건문 A B중 참이 하나라도 있는지 체크, -o OR

<test.sh>
t_value=테스트입니다.
if [ $t_value ]
then
     echo t_value = $t_value
fi

if [ -z $t_zero ]
then
     echo t_zero 는 NULL 입니다.
fi



case도 제공을 하는데 형식은 다음과 같다.

case $변수명 in
문장1)
       첫번째 명령어;;
문장2)
       두번째 명령어;;
문장3)
       세번째 명령어;;
*)
       Default 명령어;;
esac


제어문(반복문)

while문의 형식은 다음과 같다.

while [ 조건 ]
do
명령어 구문
done

<. whileTest.sh>
#!/bin/sh
while [ $# -gt 0 ]
   echo "< $1 명령 실행 > "
   $1
   Shift
done

위의 예제에서 shift 명령어를 사용하는데. Shift는 인수로 들어온 내용을 하나씩 옮겨가는 기능을 한다, shift가 한번 실행되면 $1 $2이 되고 $2 $3이 된다.(???)

until 

#!/bin/sh
until [ $# -le 0 ]
   echo "< $1 명령 실행 > "
   $1
   Shift
done

for 

for 변수명 in value1 value2 ...
do
   반복 실행 문장
done

while/until 에서 사용한 예제를 for로 변경하면 다음과 같다.
#!/bin/sh
for variable in $*                     # $* : 인수로 들어온 모든 문자열
do
       echo < $variable 명령 실행>
       $variable
done

for 키워드 뒤에 변수명(variable)이 오고 in 키워드 뒤에 값들이 나열된다이것은 in 뒤에 있는 값이 하나씩 variable에 할당이 되면서 값의 할당이 끝날때까지 do~done를 반복한다.

함수 작성

함수를 사용하려면 스크립트의 시작부에 정의가 되어 있어야 한다.
함수의 형식은 다음과 같다.
함수명()
{
       함수 내용
}

함수 호출은 인자가 없는 함수는 함수명만 호출하면 되고인자가 있는 함수는 함수명 뒤에 인자를 나열해주면 된다.( 괄호는 쓰지 않는다.)
함수 내부에서 넘겨받은 인자를 쓰는 방법은 쉘 프로그램이 인자를 쓰는 방법과 같다.($1, $2, )
함수명()
{
     argc=$#
     if [ argc = 1 ]
     then
        printf "함수의 파라메터는 %s 입니다" $1  
     fi
}

추가 참조 : http://blog.gaerae.com/2015/01/bash-hello-world.html




댓글

이 블로그의 인기 게시물

4,5,6 띠 저항의 색띠를 읽는 법(띠저항 값)

수지에서 인천공항 리무진 버스 (인천공항버스정보)(2022년3월업데이트)

수지에서 김포공항 리무진 버스 ( 2022년 3월 업데이트 )