2022-04-14 Shell_script_3

2022. 4. 15. 00:32BE/Linux

Shell script 예제

 

강의 시간에 배운 예제를 중심으로 이해해보자.

 


read

vim name.sh

#!/bin/bash

read -p "enter your name: " first last

echo "First name is $first"
echo "Last name is $last"

이름을 묻고 성과 이름으로 나눠 출력한다.

 


if 

 

if [ ] syntax

if [ 조건절 ]
then
    실행절
elif [ 조건절 ]
then
    실행절
else
    실행절
fi

 

조건절에 사용될 수 있는 옵션들

 

기능 Numeric String
Greater than -gt  
Greater than or equal -ge  
Less than -lt  
Less than or equal -le  
Equal -eg =, ==
Not equal -ne !=
str1 is less than str2   str1 < str2
str1 is greater than str2   str1 > str2
String length is greater than zero   -n str
String length is zero   -z str

 

-s 파일명 파일이 존재
-f 파일명 파일인 경우
-d 디렉토리명 디렉토리인 경우
-w 파일명 쓰기 가능
-r 파일명 읽기 가능
-x 파일명 실행 가능
! -option 거짓인 경우

 

단, 파일은 0보다 커야 한다.

 

찾아보면 더 다양한 옵션들이 있다.

 

쉘은 오류가 있으면 1 없으면 0을 반환한다.

 

즉 일반적인 프로그래밍 언어와 달리 참이 0 거짓이 1로 약속한다.

touch text.dat

vim test.sh

#!/bin/bash

if test -w "$1"
	then
	echo "file $1 is writable"
fi

if test -r "$1"
	then
	echo "file $1 is readable"
fi

if test -x "$1"
	then
	echo "file $1 is executable"
fi

chmod +x test.sh

ll

./test.sh text.dat

test -w “$1” : 입력받은 파일이 writable한 file인지 검사

 

if [test -w "$1"];
	then
	...

이렇게 수정하면 오류가 발생한다.

 

그렇다면 왜 test는 []로 감싸지 않을까?


test

 **if [ condition ]**

여기서 [ ]는 test 명령어다.

test expression

[expression]

# expression이 참이면 0 거짓이면 1
if test -w "$1"
	then
	echo "file $1 is writable"
fi

###############################

if [ -w "$1" ]
	then
	echo "file $1 is writable"
fi
#둘은 같은 의미

shell의 if문의 역할은 명령어가 정상적으로 실행되었는지 판별한다.

 

일반적으로 알고 있는 다른 언어의 if와 다르다.

 

shell의 if는 참과 거짓으로 판단하지 않고 명령어의 정상적인 수행 여부로 판단한다.

 

그렇기에 조건문에서 참과 거짓을 판별하는 명령어가 따로 필요하다.

 

test 명령어가 그런 역할을 수행한다.

 

if문과 같이 사용되는 경우가 많다.

 

#!/bin/bash

if touch nyannyan ;
then
echo "정상적인 명령어 수행시 if문 실행."
else
echo "비정상적인 명령어 수행시 else문 실행"
fi

#출력
#"정상적인 명령어 수행시 if문 실행."

 

https://jhnyang.tistory.com/147

https://jhnyang.tistory.com/146

 


예제1

#!/bin/bash

read -p "enter years of work: " Years

if [ ! "$Years" -lt 20 ]; 
then
	echo "you retire"
else
	echo "no retire"	
fi
#!/bin/bash

read -p "enter years of work: " Years

if [ "$Years" -ge 20 ]; 
then
	echo "you retire"
else
	echo "no retire"	
fi

20 이상 근무한 사람 은퇴(?)시키는 스크립트다.

 

추가

#!/bin/bash

read -p "enter years of work: " Years

if [ "$Years" > 20 ] # 오류 발생! <와 >는 리다이렉션 예약어다.
then
    echo "you retire"
else
    echo "no retire"
fi

##수정##

#!/bin/bash

read -p "enter years of work: " Years

if [ "$Years" \> 20 ] # \>, \<은 크기 비교. \>=는 안되니깐 사용을 자제. if [[ ]]  권장
then
    echo "you retire"
else
    echo "no retire"
fi

 


예제2

 

#!/bin/bash

Bonus=500
read -p "Enter A" Q1
read -p "Enter 1" Q2

if [ "$Q1" = "A" -a "$Q2" = 1 ]
then
	echo "Good boy gets \$$Bonus bonus"
else
	echo "only good boy get a bonus"
fi

또는

#!/bin/bash

Bonus=500
read -p "Enter A" Q1
read -p "Enter 1" Q2

if [[ "$Q1" = "A" && "$Q2" = 1 ]]
then
	echo "Good boy gets \$$Bonus bonus"
else
	echo "only good boy get a bonus"
fi

둘은 의미상 같은 코드다.

 

소문자 a와 대문자 A 모두에서 작동하도록 고치는 중...

 

#!/bin/bash

Bonus=500
read -p "Enter A" Q1
read -p "Enter 1" Q2

#소문자 인정

if [[ ( "$Q1" = "A"  || "$Q1" = "a" ) && "$Q2" = 1 ]]
then
    echo "Good boy gets \$$Bonus bonus"
else
    echo "only good boy get a bonus"
fi

 

if절에 and와 or을 사용하는 방법은 크게 3가지다.

#AND
if [[ condition1 && condition2 ]] # Logical AND
if [ condition1 ] && [ condition2 ]
if [ condition1 -a condition2 ]

#OR
if [[ condition1 || condition2 ]] # Logical OR
if [ condition1 ] || [ condition2 ]
if [ condition1 -o condition2 ]

 

if [ ]에선 -a 와 -o을 이용한다.

  • -a : and
  • -o : or
# (condition1 OR condition2) AND condition3
if [[ (condition1 && condition2) AND condition3 ]]

<, >, (, ), &&와 ||등은 shell의 예약어다.

 

그렇기에 사용할 수 없다.

 

<, >는 \<, \>로 고쳐 사용한다.

 

... 아니면 if [[ ]]를 사용할 수 있다.

 

참고 : https://chocoamond.tistory.com/56


if [[ ]]

 

if [[ 조건절 ]] ; then

 

if [[ condition ]]는...

 

if []과 달리 <, >, &&, ||, ()과 연산자에 대하여 논리 연산자로 해석한다.

 

<, >, &&와 ||는 shell의 예약어다.

 

if []의 경우 <, >을 리다이렉션으로 해석한다.

 

또 &&(명령어가 성공적으로 수행되면 다음 명령어 수행)와 ||(명령어가 비정상적으로 수행되면 다음 명령어 수행)을 명령어 수행의 조건으로 해석한다.

 

if [[ ]]는 논리연산자로 해석한다.

 

되도록 if [[ ]]을 사용하자.

 

가독성이 높고 사용하기도 쉽다.

 

출처 : https://paradise7.tistory.com/42

 



아니면... tr 명령어 사용

#!/bin/bash

Bonus=500
read -p "Enter A" Q1
read -p "Enter 1" Q2

Q1=$(echo $Q1 | tr '[:lower:]' '[:upper:]')

if [[ "$Q1" = "A" && "$Q2" = 1 ]]
then
    echo "Good boy gets \$$Bonus bonus"
else
    echo "only good boy get a bonus"
fi

tr : 문자를 변환/삭제

 

[:lower:], [:upper:] : 소문자, 대문자 문자 클래스다. [a-z], [A-Z]와 같다.

 

tr

 

tr

특정 문자를 삭제 혹은 변환한다. [이렇게 써요] tr [옵션] 문자열1 [문자열2] -c, --complement : 문자열1을 아스키 값 001~337과 비교하여 보수 연산을 한다. -d, --delete : 문자열1에서 지정한 문자를 삭제

terms.naver.com


 

'BE > Linux' 카테고리의 다른 글

2022-04-22 Shell_산술_연산하는_방법  (0) 2022.04.22
2022-04-16 Shell_script_추천글  (0) 2022.04.16
2022-04-13 Shell_script_2  (0) 2022.04.14
Shell Script 띄어쓰기 (보호)  (0) 2022.04.13
2022-04-13 Shell_Kernel  (0) 2022.04.13