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
$
오늘은 포스팅 양이 좀 많네요.. 열공 합시다.
'쉘스크립트' 카테고리의 다른 글
사용자 입력 데이터 처리 (1) | 2022.07.06 |
---|---|
세부 구조적인 Shell 명령어 (1) | 2022.07.06 |
기본 Shell 스크립트 작성 (1) | 2022.07.05 |
리눅스 파일 퍼미션 (1) | 2022.07.05 |
환경 변수 (1) | 2022.07.04 |