쉘스크립트

구조화된 명령어들

트리스탄1234 2022. 7. 6. 08:41
728x90
반응형

 

1. If then 구문 사용하기

if-then 구문

스크립트에서 가장 많이 사용되는 구문중에 하나로 If ~ then문이 있습니다. 이 구문은 if 뒤에 정의되는 명령어들의 실행결과가(exit code 0) 정상수행이 되면 then 구문의 명령이 실행이되고 exit code가 0이 아니고 다른 code로 들어오면(명령어 정상 수행되지 않음) then문이 수행이 되지 않습니다. 기본적인 구문은 아래와 같습니다.

- 사용 구문

if command

then

commands

fi

if command; then

commands

fi

그럼 /etc/passwd 에 해당 사용자가 있으면 사용자의 bash shell파일을 리스트 하는 예제를 만들어 보겠습니다.

$touch test10

$gedit test10

#! /bin/bash

# if then 구문 여러 명령어 실행하기

testuser=hyowon

if grep $testuser /etc/passwd

then

echo "The bash files for user $testuser are:"

ls -a /home/$testuser/.b*

fi

#

그리고 실행을 하면

$ ./test10

hyowon:x:1000:1000:hyowon,,,:/home/hyowon:/bin/bash

The bash files for user hyowon are:

/home/hyowon/.bash_history /home/hyowon/.bash_logout /home/hyowon/.bashrc

then 구문이 정상 실행되는 것을 볼수 있습니다. 하지만 여기서 testuser에 passwd파일에 존재하지 않는 값을 넣고 테스트를 하면 아래와 같이 아무런 출력 결과가 나오지 않습니다.

$ ./test10

$

elseif 구문

elseif 구문은 if 구문의 확장이라고 생각하시면 될것 같습니다. 조건절 if를 여러개 사용할수 있다는 점이 if 문보다 나은 점이라고 생각이 됩니다. 그리고 사용구문은 아래와 같습니다. if구문과 마찬 가지고 elseif 구문의 exit code가 0일때(명령어 실행결과가 정상 종료일때) then 구문이 실행이 됩니다.

if command1

then

commands

elif command2

then

more commands

fi

2. Test 명령어 사용하기

if-then-elseif문 에서는 exit code로 명령어 수행여부를 결정을 했지만, 조건절 비교결과로 then 명령어 문을 실행시키고 싶은 경우가 있을 것입니다. 사용구문은 아래와 같이 test 명령어뒤에 검사할 조건을 주면 됩니다. test명령어는 뒤에 오는 조건절을 검사를 하고 true이면 exit code를 0으로 false이면 1로 결과값을 리턴 합니다. test명령의 단점은 test 명령은 부동 소수점을 처리를 하지 못합니다. bc 명령어와 같이 부동 소수점을 처리 하기 위해 사용하는 경우 test가 부동 소수점을 지원하지 않기 때문에 원하는 결과가 나오지 않습니다. 그리고 test라는 명령어 대신 조건절을 브라켓으로 묶어서 사용도 가능합니다.

test로 비교 가능한 조건들은 아래 3가지의 경우 입니다.

- 숫자비교

- 스트링 비교

- 파일 비교

구문

test condition 또는

if [ condition ] ==> 브라켓과 Condition 사이에는 Space를 넣어 주어야 됨.

then

commands

fi

숫자 비교 예제

$touch test11

$gedit test11

#숫자 및 변수 비교 예제

val1=15

val2=20

if [ $val1 -gt 5 ]

then

echo "The test value $val1 is greater than 5"

fi

if [ $val1 -eq $val2 ]

then

echo "The values are equal"

else

echo "The values are different"

fi

그럼 실행시켜 보겠 습니다.

$ ./test11

The test value 15 is greater than 5

The values are different

아래표는 비교 연산자 표 입니다.

반응형

문자열 비교

test 명령은 문자열 비교도 가능 합니다. 아래와 같이 간단한 예제를 만들어 보겠습니다.

#! /bin/bash

# test 문자열 비교 예제

tempuser=hyowon

if [ $USER = $tempuser ] ==> 현재 로그인 되어 있는 user와 tempuser 명이 같은지 비

then

echo "Welcome $tempuser"

fi

#

실행을 시키면

$ ./test13

Welcome hyowon

아래는 문자열 비교에 사용할 수 있는 연산자들 입니다.

문자열 순서

문자열 비교를 진행할때에는 아래 2가지 사항에 대하여 주의를 하여야 합니다.

1) >, < 비교 연산자 앞에는 백슬러쉬를 입력 해야 리다이렉트로 인식이 되지 않습니다.

2) >, <의 결과는 sort 명명과 동일하지 않습니다. 비교 연산자는 ASCII Code로 비교를 하지마 sort는 시스템 위치 언어 설정순으로 정렬을 해 줍니다.

아래는 예제 입니다.

$ cat test9b

#!/bin/bash

# testing string sort order

val1=Testing

val2=testing

if [ $val1 \> $val2 ]

then

echo "$val1 is greater than $val2"

else

echo "$val1 is less than $val2"

fi

$ ./test9b

Testing is less than testing

$ sort testfile

testing

Testing

$

문자열 길이비교

문자열 길이 비교 예제를 하나 만들어 보겠습니다.

#! /bin/bash

#문자열 길이 비교 예제

val1=test

val2=' '

if [ -n $val1 ]

then

echo "The string 'val1' is not empty"

else

echo "The string '$val1' is empty"

fi

if [ -z $val2 ]

then

echo "The string ’$val2’ is empty"

else

echo "The string ’$val2’ is not empty"

fi

if [ -z $val3 ]

then

echo "The string ’$val3’ is empty"

else

echo "The string ’$val3’ is not empty"

fi

실행을 시켜 보면

$ ./test14

The string 'test' is not empty

The string ’ ’ is empty

The string ’’ is empty

아래표는 문자열의 길이를 비교하는 연산자들 입니다.

파일 비교하기

test 명령은 파일도 비교를 할수가 있습니다. 우선 디렉토리 비교를 하는 예제를 살펴 보겠습니다.

-d 옵션은 디렉토리가 있는지 없는지를 검사해 줍니다.

$touch test15

$gedit test15

#! /bin/bash

#디렉토리 점검 예제

if [ -d $HOME ]

then

echo "Your Home directory exists"

cd $HOME

ls

else

echo "Threr's problem with your HOME directory"

fi

실행을 시키면.

$ ./test15

Your Home directory exists

1234.mkv

13826761_MotionElements_energetic-action-sport-rock-30sec-powerful-aggressive-background-music_preview-2.mp3

13826761_MotionElements_energetic-action-sport-rock-30sec-powerful-aggressive-background-music_preview.mp3

2020-10-10 15-25-47.mkv

NPKI

Steam

VirtualBox VMs

age.txt

deja-dup

dir.Iu6oW4

dir.d03tYD

이번에는 디렉토리와 파일을 검사를 해보고 없는경우 생성하고 정보를 추가하는 스크립트를 작성해 보겠습니다.

#! /bin/bash

#디렉토리 밑 파일 존재 여부 검사 후 없을때 추가

if [ -e $HOME ]

then

echo "Direcroty exists. let's check file"

#checking file

if [ -e $HOME/testing ]

then

echo " file exists, append data to it"

date >> $HOME/testing

else

echo "creating file"

date > $HOME/testing

fi

else

echo "no Home directory"

fi

실행을 시켜 봅시다.

$ ./test16

Direcroty exists. let's check file

creating file

$ ./test16

Direcroty exists. let's check file

file exists, append data to it

$

--e 옵션은 파일과 디렉토리의 존재 여부를 알려 줍니다. 파일인지만을 검사할때에는 -f 옵션을 사용해야 합니다.

예제를 하나 만들어 보도록 하겠습니다.

#!/bin/bash

# check if a file

if [ -e $HOME ]

then

echo "The object exists, is it a file?"

if [ -f $HOME ]

then

echo "Yes, it’s a file!"

else

echo "No, it’s not a file!"

if [ -f $HOME/.bash history ]

then

echo "But this is a file!"

fi

fi

else

echo "Sorry, the object doesn’t exist"

fi

실행을 시켜 보면

$ ./test17

The object exists, is it a file?

No, it’s not a file!

But this is a file!

$

파일 읽기 권한 검사 예제

파일이 존재 하는지를 검사 하고, 그 다음에 읽기 권한이 있는지 검사하는 예제를 만들어 보겠습니다.

#!/bin/bash

#파일을 읽을 수 있는지 검사

pwfile=/etc/shadow

# 먼저 파일이 존재하는지 검사

if [ -f $pwfile ]

then

# 읽기가 가능한지 검사

if [ -r $pwfile ]

then

tail $pwfile

else

echo "Sorry, I’m unable to read the $pwfile file"

fi

else

echo "Sorry, the file $file doesn’t exist"

fi

#

이제 실행을 시켜 봅시다.

$ ./test18

Sorry, I’m unable to read the /etc/shadow file

$ ./test18

빈파일 검사 하기

-s 옵션은 파일이 비어 있는지 아닌지를 검사해 결과를 돌려 줍니다. 예제를 한번 만들어 봅시다.

#!/bin/bash

# testing if a file is empty

file=t15test ==> file 변수에 파일명으로 사용될 값을 입력 합니다.

touch $file ==> 입력된 값으로 파일을 생성

if [ -s $file ] ==> 파일이 비어있는지 확인 하고 비어있으니까

then

echo "The $file file exists and has data in it" ==> 이구문이 실행이 됩니다.

else

echo "The $file exists and is empty"

fi

date > $file ===> date의 결과를 file 값에 넣어 줍니다.

if [ -s $file ] ==> file을 검사해 보면 비어 있지가 않아서

then

echo "The $file file has data in it"

else

echo "The $file is still empty" ==>

fi

#

실행을 시켜 보면.

$./test15

The t15test exists and is empty

The t15test file has data in it

$

파일 쓰기 권한 확인

-w 옵션은 파일에 쓰기 권한이 있는지 확인을 해줍니다. 예제를 하나 만들어 봅시다.

#!/bin/bash

# checking if a file is writeable

logfile=$HOME/t16test

touch $logfile

chmod u-w $logfile ==> 쓰기 권한을 빼줍니다.

now=`date +%Y%m%d-%H%M` ==> now에 date의 수행결과를 날짜 형식을 지정하여 저장합니다.

if [ -w $logfile ] ==> 파일이 존재하고 쓸수 있는 권한이 있으면 then 구문 실행

then

echo "The program ran at: $now" > $logfile

echo "The fist attempt succeeded"

else

echo "The first attempt failed"

fi

chmod u+w $logfile ==> 파일에 쓰기권한을 부여 하고 테스트를 합니다.

if [ -w $logfile ] ==> 파일이 존재하고 쓰기 권한이 있으면 then 구문 실행

then

echo "The program ran at: $now" > $logfile

echo "The second attempt succeeded"

else

echo "The second attempt failed"

fi

실행을 시켜보면.

$ ./test16

The first attempt failed

The second attempt succeeded

$ cat $HOME/t16test

The program ran at: 20070930-1602

$

파일의 실행권한 검사 하기

$ cat test17

#!/bin/bash

# testing file execution

if [ -x test16 ] ==> 파일이 존재하고 실행이 가능하면 then 구문 실행

then

echo "You can run the script:"

else

echo "Sorry, you are unable to execute the script"

fi

실행을 시켜 보면

$ ./test17

You can run the script:

파일의 오너쉽 검사 하기

-0는 파일의 소유자가 현재 사용자가 맞는지를 확인하는 옵션입니다. 예제를 하나 만들어 보겠습니다.

#!/bin/bash

# check file ownsership

if [ -O /etc/passwd ] ==> passwd 파일의 소유자가 현 사용자 인지 확인.

then

echo "You’re the owner of the /etc/passwd file"

else

echo "Sorry, you’re not the owner of the /etc/passwd file"

fi

$ ./test18

Sorry, you’re not the owner of the /etc/passwd file

$ su ==> passwd 파일의 소유자인 root로 변경후 테스트

Password:

# ./test18

You’re the owner of the /etc/passwd file

#

그룹의 디폴트 그룹을 확인하고 사용자의 그룹과 동일한지 확인.

#!/bin/bash

# check file group test

if [ -G $HOME/testing ]

then

echo "You’re in the same group as the file"

else

echo "The file is not owned by your group"

fi

$ ls -l $HOME/testing

-rw-rw-r-- 1 rich rich 58 2007-09-30 15:51 /home/rich/testing

$ ./test19

You’re in the same group as the file

$ chgrp sharing $HOME/testing

$ ./test19

The file is not owned by your group

$

두파일의 생성날짜 비교 스크립트.

파일이 설치된 날짜를 비교하고 설치 하려는 파일이 구 버전일때 설치를 못하게 하는 방식으로 많이 쓰입니다.

file1 -nt file2 : file1이 file2보다 날짜가 오래되지 않았으면 실행

file1 -ot file2 : file1이 file2보다 날짜가 오래 되었으면 실행

#!/bin/bash

# testing file dates

if [ ./test19 -nt ./test18 ]

then

echo "The test19 file is newer than test18"

else

echo "The test18 file is newer than test19"

fi

if [ ./test17 -ot ./test19 ]

then

echo "The test17 file is older than the test19 file"

fi

실행을 시켜 보면.

$ ./test20

The test19 file is newer than test18

The test17 file is older than the test19 file

$ ls -l test17 test18 test19

-rwxrw-r-- 1 rich rich 167 2007-09-30 16:31 test17

-rwxrw-r-- 1 rich rich 185 2007-09-30 17:46 test18

-rwxrw-r-- 1 rich rich 167 2007-09-30 17:50 test19

$

3. 여러개의 조건절 비교

여러개의 조건절을 붙여서 사용이 가능한데요. 그 방법은 and연산이나 or 연산을 하게 할수 있습니다.

■ [ condition1 ] && [ condition2 ] ==> 조건 1과 조건 2가 참이어야지 then 구문이 실행

■ [ condition1 ] || [ condition2 ] ==> 조건1이나 조건 2중 한개만 true이면 then 구문 실행

예문

$ cat test22

#!/bin/bash

# testing compound comparisons

if [ -d $HOME ] && [ -w $HOME/testing ]

then

echo "The file exists and you can write to it"

else

echo "I can’t write to the file"

fi

$ ./test22

I can’t write to the file

$ touch $HOME/testing

$ ./test22

The file exists and you can write to it

$

4. 진보된 If-Then 기능

if-then구문 중 최근에 추가된 아래 2개의 기능이 있습니다.

■ 수학적인 표현을 위한 쌍괄호 사용

■ 문자열 취급을 위한 쌍대괄호 사용

쌍괄호를 사용하는 스크립트 예제

#!/bin/bash

# using double parenthesis

val1=10

if (( $val1 ** 2 > 90 )) ==> $val1의 2승이 90보다 크면 then실행

then

(( val2 = $val1 ** 2 ))

echo "The square of $val1 is $val2"

fi

$ ./test23

The square of 10 is 100

$

쌍괄호 사용 연산자들의 종류는 아래표와 같습니다.

쌍대괄호 사용하는 스크립트

#!/bin/bash

# using pattern matching

if [[ $USER == r* ]] ==> USER의 값이 r로 시작되는 지 확인.

then

echo "Hello $USER"

else

echo "Sorry, I don’t know you"

fi

$ ./test24

Hello rich

$

5. Case 명령어

Case는 각각의 경우마다 실행할 명령을 별도로 지정을 할수 있다.

#!/bin/bash

# looking for a possible value

if [ $USER = "rich" ] ==> USER의 값이 rich 이면

then

echo "Welcome $USER"

echo "Please enjoy your visit"

elif [ $USER = barbara ] ==> babara 인경우

then

echo "Welcome $USER"

echo "Please enjoy your visit"

elif [ $USER = testing ]

then

echo "Special testing account"

elif [ $USER = jessica ]

then

echo "Don’t forget to logout when you’re done"

else

echo "Sorry, you’re not allowed here"

fi

$ ./test25

Welcome rich

Please enjoy your visit

$

오늘은 포스팅 양이 좀 많네요.. 열공 합시다.

728x90
반응형

'쉘스크립트' 카테고리의 다른 글

사용자 입력 데이터 처리  (1) 2022.07.06
세부 구조적인 Shell 명령어  (1) 2022.07.06
기본 Shell 스크립트 작성  (1) 2022.07.05
리눅스 파일 퍼미션  (1) 2022.07.05
환경 변수  (1) 2022.07.04