2022. 4. 15. 00:32ㆍBE/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]와 같다.
'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 |