구조

while  <명령어(주로 조건식)>
do
   반복처리
done

 

홀수 출력하기 예시

while-example.sh

#!/bin/bash

i = 1
while [ "$i" -le 10 ]      # 10 이하까지 반복
do
    echo "$i"
    i = $((i+2))               # 산술연산자
done

 

 

산술연산자

$ i=10
$ echo $(( i + 1 ))
11
$ echo $(( i / 2))
5
$ echo $(( i * 2 ))
20
$ echo $(( i ** 2))
100

지정한 문자열의 패턴에 따라 분기할 수 있는 제어 구조

●  구조

case-example.sh

#!/bin/bash

case "$1"  in                # case <문자열> in
    start | stop )             #          <패턴 1>)
          echo "OK"          #             처리 1
          ;;                          #              ;;
    * )                        
          echo "NG"
          ;;
esac

 패턴은 항상 ')' 로 끝나야 함

 패턴의 개수 제한은 없다.

 마지막 패턴  * 는 아무것도 해당하지 않을 경우를 지정하기 위해서 사용

for 문

지정된 명령어를 실행하여 종료상태가 0 이면 참으로 판단하고 그 외에는 거짓으로 판단

●  구조

for-example.sh

#!/bin/bash

for name in aaa bbb ccc     # for 변수 in 리스트
do
     echo $ name                   # 반복처리   
done

 

  ▶  리스트에  가능한 것들

       - 경로확장 : *.html

       - 명령어 치환 : ex)  $(seq 1 5)   1 부터 5까지 반환

       - 커맨드라인의 모든 인자 :  "$@"
                  ex)  for-example.sh  readme.txt "hello" 100

 

if 문

지정된 명령어를 실행하여 종료상태가 0 이면 참으로 판단하고 그 외에는 거짓으로 판단

 

셸 스크립트 예시

if-bin.sh

#!/bin/bash

if [ "$1" = "bin" ]; then   # 해석 : 커맨드 라인에서 인자 1이 "bin" 이면 OK 출력
   echo "OK"
ellif [ "$1" = "hello" ]; then
   echo "Hello" 
else
   echo "NG"
fi

  ▶ if 뒤에는 조건문이 아닌 명령어 

  ▶ [ 가 명령어 : [ 뒤에 오는 "$1", "bin",  ] 모두 명령어 [ 의 인자

  ▶ 문법상의 주의점
         띄어쓰기
         - [ ] 안의 문자열 간의 공백 필수

         - if 와 [ 사이에 공백

         - if [   ] 후에 세미콜론(;)

사용

$ ./if-bin.sh "bin"
OK

  

● 명령어의 종료상태 확인 코드

$ echo $?     # 직전에 사용한 명령어의 종료 상태 출력

  ▶  종료 상태면 0, 에러가 발생하면 0 이외의 값 출력

$ [ "$1" = "bin" ]   # 조건식 명령어 실행 : 참이면 0, 아니면 0 이외의 값 
$ echo $?            
1                    # 조건식 뒤에 아무 값이 없으므로 1 출력

  ▶  if 문도 참이면  0, 에러가 발생하면 0 이외의 값 출력

#!/bin/bash

if [ -z "$1" ]; then
   exit 1         
fi

  exit 를 이용하여 출력할 종료상태를 지정

 test 명령어

if [ "$1" = "bin" ]; then      
if test "$1" = "bin";  then 

  둘 다 같은 의미를 지님

 연산자

문자열 비교

연산자 내용
str1 = str2 str1 과 str2 가 같음 
str1 != str2 같지 않음
-n str1 빈 문자열이 아님
-z str1 빈 문자열임 → 빈 문자열이면 참 

 

정수 비교 - 오직 정수만 다룸

연산자 내용
1 -eq 2 같다
1 -ne 2 같지 않다
1 -lt 2 < , 1 이 2 보다 작음
1 -le 2 ≤ , 1 이 2 이하임
1 -gt 2 > , 1 이 2 보다 큼 
1 -ge 2 ≥ ,  1이 2 이상임

 

파일 속성

연산자 내용
-e < file 명> < file 명> 존재
-d < file 명> < file 명> 존재하고 디렉터리임
-h < file 명> < file 명> 존재하고 심볼릭 링크임
-L < file 명> < file 명> 존재하고 심볼릭 링크임
-f < file 명> < file 명> 존재하고 일반 파일임
-r < file 명> < file 명> 존재하고 읽기 권한이 부여되어 있음
-w < file 명> < file 명> 존재하고 쓰기 권한이 부여되어 있음
-x < file 명> < file 명> 존재하고 실행 권한이 부여되어 있음
< file 명1 > -nt < file 명 2 > < file 명 1 > 의 변경 시각이 < file 명 2> 보다 최근임
< file 명 1 > -ot < file 명 2 > < file 명 1 > 의 변경 시작이 < file 명 2 >  보다 오래됨

 

결합 연산자

연산자 내용
조건식 1 -a 조건식2 두 조건식이 참이면 참 (and)
조건식 1 -o 조건식2 두 조건식중 하나가 참이면 참(or)
! 조건식 조건식의 진위값을 반대로 함(not)
() 조건식을 그룹화



&& 와 ||

명령어 1 && 명령어 2 : 명령어 1이 정상종료하여야 명령어2를 실행

$ [ -f file.txt ] && cat file.txt

 

명령어 1 || 명령어 2 : 명령어 1이 정상종료하지 않아야 명령어2를 실행

$ [ -f file.txt ] || touch file.txt

변수

 

쿼팅 (quoting)

따옴표로 문자열을 묶는 행위

 

▨ "" 와 '' 의 차이

 

명령어 치환

▨ 명령어 치환 → $()

#!/bin/bash

filename = $(date '+%Y-%m-%d')
touch "$filename"
$ echo "Today is $(date '+%Y-%m-%d')"
Today is 2024-04-09

 

 

위치 파라미터

$1, $2 → 커맨드 라인 인자의 값(위치 파라메터)

parameter.sh

#!/bin/bash

echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$3 = $3"
echo "\$4 = $4"
echo "\$5 = $5"
echo "\$# = $#"  # 지정한 인자의 총 개수를 확인하는 방법 $#

 

▨ command line 에 인자 3개를 지정하여 실행 

$ ./parameters.sh aaa bbb ccc
$0 = ./parameters.sh
$1 = aaa
$2 = bbb
$3 = ccc
$4 =
$5 =
$# = 3

 

▨ 와일드카드 * 사용

$ ls
drink2.txt    homesize.sh   parameters.sh score.csv
$ ./parameters.sh *
$0 = ./parameters.sh
$1 = drink2.txt
$2 = homesize.sh
$3 = parameters.sh
$4 = score.csv
$5 =
$# = 5

 

▨ 인자 전체 조회 → $@,  $*

args.sh

#!/bin/bash

echo "\$@ = $@"
echo "\$* = $*"

 

실행

$ ./args.sh aaa bbb ccc "hello"
$@ = aaa bbb ccc hello
$* = aaa bbb ccc hello

- 출력이 같아 보이지만 사실상 아래와 같이 출력됨

   $@ = "aaa" "bbb" "ccc" "hello" : 각 각의 문자열

   $* = "aaa bbb ccc hello"   : 하나의 문자열

 

+ Recent posts