이번 편에는 if문 case문 그리고 비교연산입니다. 비교연산도 연산자 포스팅에 엮고자 했는데 다른 블로그들을 둘러보았을 때 대개 조건문에 엮어서 진행했고 바위는 물길을 버틸지 모르겠지만 돌멩이는 흐름에 몸을 맡겨야지 싶어서 이렇게 진행합니다.
문자열 비교 | 설명 |
---|---|
"문자열1" = "문자열2" | 두 문자열이 같으면 참 |
"문자열1" != "문자열2" | 두 문자열이 다르면 참 |
-z "문자열" | 문자열이 NULL이면 참 |
-n "문자열" | 문자열이 NULL이 아니면 참 |
산술 비교 | 설명 |
---|---|
값1 -eq 값2 | equal |
값1 -ne 값2 | not equal |
값1 -lt 값2 | 값1이 값2보다 작으면 참 less than |
값1 -le 값2 | 값1이 작거나 같으면 참less or equal |
값1 -gt 값2 | 값1이 값2보다 크면 참 greater than |
값1 -ge 값2 | 값1이 작거나 같으면 참greater or equal |
파일 검사 조건 | 설명 |
---|---|
[ -b FILE ] | 블록 파일이면 참 |
[ -d FILE ] | 디렉토리라면 참 |
[ -e FILE ] | 파일이 존재하면 참 |
[ -f FILE ] | 파일이 존재하고 일반 파일이면 참(-e보다 주로 사용) |
[ -L FILE ] | 심볼릭 링크 파일이면 참 |
[ -r FILE ] | 읽을 수 있는 파일일 때 참 |
[ -s FILE ] | 파일 크기가 0이 아니면 참 |
[ -w FILE ] | 쓰기 가능한 파일일 때 참 |
[ -x FILE ] | 실행 가능한 파일일 때 참 |
정해진 공백 규칙을 따르지 않으면 오류를 맞이하게 됩니다.
./iftest.sh: line 6: [: missing `]'
1 #!/usr/bin/bash
2
3 a=10
4 b=20
5
6 if [ $a == $b ] #
7 then
8 echo "a is equal to b"
9 fi
10
11 if [ $a != $b ]
12 then
13 echo "a is not equal to b" #두 수는 같지 않으니 13번 라인이 출력된다.
14 fi
1 #!/usr/bin/bash
2
3 a=10
4 b=20
5
6 if [ $a -gt $b ] #비교연산이 여기서 등장 그래서 묶어서 포스팅했나..!
7 then
8 echo a is greater than b
9 else
10 echo a is less than b #a는 b보다 작으므로 10번 라인이 출력된다.
11 fi
1 #!/usr/bin/bash
2
3 a=10
4 b=20
5
6 if [ $a == $b ]
7 then
8 echo a is equal than b
9 elif [ $a -gt $b ]
10 then
11 echo a is greater than b
12 elif [ $a -lt $b ]
13 then
14 echo a is less than b #ELSE와 같이 조건이 더 생겼을 뿐 결과는 같다.
15 else
16 echo None of the condition met
17 fi
앞서 진행한 예시들보다 복잡해 보이지만 난해할 것이 없습니다!
1 #!/usr/bin/bash
2
3 YYMMDD=`date "+%y%m%d"`
4
5 dir="/root" #실습용으로 만든 계정이라 root를 썼고 보안을 위해서는 root 외 계정 권장
6 folder="/data_log" #LOG FILE이 들어갈 디렉토리
7 file="DATE_${YYMMDD}.txt" #LOG FILE NAME
8
9 if [ -e $dir$folder ]
10 then
11 cd $dir$folder
12 echo $dir$folder already exists
13 if [ -e $dir$folder/$file ]
14 then
15 echo $file already exists
16 date > $file
17 echo Rewrote $file #만약 LOG FILE이 존재하면 덮어쓰기를 진행한다.
18 else
19 cd $dir$folder
20 date > $file
21 echo $file was created! #CREATE TO LOG FILE
22 fi
23 else
24 echo $folder does not exist #위에 선언한 폴더가 존재하지 않을 경우
25 mkdir $dir$folder; cd $dir$folder; date > $file #디렉토리 생성, 이동, 파일 생성
26 echo The $file was created in $dir$folder!
27 fi
1 #!/usr/bin/bash
2
3 printf "사용하는 OS의 첫 알파벳을 입력해보세요 : "
4 read -n 1 var #사용자에게 한 글자를 입력 받음.
5
6 echo
7 case $var in
8 "l" | "L") echo "리눅스" ;; # 입력한 값이 l이라면 실행
9 "u" | "U") echo "유닉스" ;;
10 "w" | "W") echo "윈도우즈" ;;
11 "m" | "M") echo "맥OS" ;;
12 *) echo "뭔데" #다른 OS도 많겠지만 간단하게 진행
13 exit 1
14 ;; # default 마무리
15 esac
16 exit 0
갑자기 튀어나온 exit, read에 당황스럽겠지만 차근차근 풀어나가겠습니다.
이쯤에서 계산기를 한 번 스크립트로 짜보겠습니다.직접 만들어보면 영감을 얻기 마련이니까요.
# !/usr/bin/bash
# 숫자 두 개 입력
echo "Enter Two numbers : "
read a
read b
# 기호 입력
echo "Enter Choice :"
echo "1. Addition"
echo "2. Subtraction"
echo "3. Multiplication"
echo "4. Division"
read ec
case $ec in
1)res=`echo $a + $b | bc`
;;
2)res=`echo $a - $b | bc`
;;
3)res=`echo $a \* $b | bc`
;;
4)res=`echo "scale=2; $a / $b" | bc`
;;
*) echo "Unknown Number" ; exit 1
;;
esac
echo "Result : $res"
1 #!/usr/bin/bash
2
3 count=0
4
5 while [ ${count} -le 5 ]
6 do
7 echo ${count}
8 count=$(( ${count}+1 )) #((count++)) 단순하게 표현도 가능하다.
9 done
#5번 행의 대괄호 대신 이중 괄호를 이용해 논리 표현식을 사용할 수 있다.
#while (( ${count} <= 5 ))
위 주석을 이용해 한 번 더 스크립트를 짜보아도 되고 밑의 코드는 스킬 상승에 도움된다 싶어 공유합니다.
할 수 있을 거에요.
1 #!/usr/bin/bash
2
3 year=$1
4 month=$2
5
6 startNum=`date +"%u" -d ${year}${month}01`
7 startDate=`date +"%Y%m%d" -d ${year}${month}01`
8 endDate=`date +"%Y%m%d" -d "${year}${month}01 +1 month"`
9
10 echo -e "\t\t *** `date +"%b %Y" -d $startDate` ***"
11 echo -e "MON\tTUS\tWED\tTHU\tFRI\tSAT\tSUN"
12
13 i=1
14 while [ $i -lt $startNum ]
15 do
16 printf "\t"
17 ((i++))
18 done
19 while [ $startDate != $endDate ]
20 do
21 dayOfWeek=`date +%u -d $startDate`
22 date=`date +%d -d $startDate`
23 printf "${date}\t"
24 if [ $((${dayOfWeek}%7)) == 0 ]
25 then
26 echo
27 fi
28 startDate=`date +%Y%m%d -d "$startDate +1 day"`
29 done
30 echo
1 #!/usr/bin/bash
2
3 list="1 2 3 4 5"
4 for var in $list
5 do
6 echo var value :$var
7 done
8
9 for var2 in "1 2 3 4 5"
10 do
11 echo var2 value :$var2
12 done
같아보이지만 다른 결과를 도출하는 두 가지 케이스를 만들어봤는데 보고 어떤 값이 도출되는지에 확신이 없으면 이또한 직접 짜보시길!
1 #!/usr/bin/bash
2
3 for file in /etc/*
4 do
5 echo ${file}
6 done
# for file in /etc/*; do echo ${file}; done;
#엔터 대신 ;(세미콜론)을 사용하면 한 줄로 축약이 가능하다.(즉 터미널에서 사용 가능)
1 #!/usr/bin/bash
2
3 for file in /etc/*
4 do
5 if [ "${file}" == "/etc/passwd" ]; then
6 echo "Find it. ${file}"
7 break
8 fi
9 done
/etc/ 디렉토리의 존재하는 하위 파일, 디렉토리들을 출력하는 스크립트 그리고 break를 이용해 /etc/passwd를 찾으면 멈추는 스크립트를 짜보았습니다.
도움 받은 글
https://github.com/imysh578/Self-Study/blob/main/Linux/calendar/calendar.sh
https://jhnyang.tistory.com/191