$(expr) | $[ ] | $(( )) |
---|---|---|
+ | + | + |
- | - | - |
* | * | * |
% | % | % |
$[ ]
를 많이 씀$[ ]
은 bash
에서만 동작하니 sh
에서는 쓰지 말것!something=$(($var1 + $var2))
$((something = $var1 + $var2))
$(expr)
, $[ ]
, $(())
) 모두 이런 동작을 지원한다.(())
마치 프로그래밍 lang 같이 동작함.+=
-=
*=
/=
%=
>>=
<<=
&=
^=
|=
**
<<
>>
&
|
&&
||
위에서 본 3가지($(expr)
, $[ ]
, $(())
) 를 사용해서 간단한 스크립트를 작성해보자.
스크립트-1 : 골고루 써보기
#!/bin/bash
read -p "Input two numbers : " num1 num2
echo
echo "Add = $(expr $num1 + $num2)"
echo "Sub = $(expr $num1 - $num2)"
echo "Div = $(expr $num1 / $num2)"
echo "Mod = $(expr $num1 % $num2)"
echo
read -p "Input two numbers : " num1 num2
echo "Add = $[$num1 + $num2]"
echo "Sub = $[$num1 - $num2]"
echo "Div = $[$num1 / $num2]"
echo "Mod = $[$num1 % $num2]"
echo
read -p "Input two numbers : " num1 num2
echo "Add = $((num1 + num2))"
echo "Sub = $((num1 - num2))"
echo "Div = $((num1 / num2))"
echo "Mod = $(($num1 % $num2))"
echo
var1=$(expr $num1 + $num2) # + 사이사이에 띄어쓰기!
echo $var1
var2=$[$num1+$num2]
echo $var2
var3=$((num1+num2)) # 변수명 앞에 $는 필수 아님
echo $var3
((var4=num1+num2))
echo $var4
실행-1
[dailycode@myComp:lab]$ ./e.sh
Input two numbers : 32 4
Add = 36 # $(expr $num1 + $num2)
Sub = 28 # $(expr $num1 - $num2)
Div = 8 # $(expr $num1 / $num2)
Mod = 0 # $(expr $num1 % $num2)"
Input two numbers : 7 4
Add = 11 # $[$num1 + $num2]
Sub = 3 # $[$num1 - $num2]
Div = 1 # $[$num1 / $num2]
Mod = 3 # $[$num1 % $num2]
Input two numbers : 53 3
Add = 56 # $((num1 + num2))
Sub = 50 # $((num1 - num2))
Div = 17 # $((num1 / num2))
Mod = 2 # $(($num1 % $num2))
56 # var1=$(expr $num1 + $num2)
56 # var2=$[$num1+$num2]
56 # var3=$((num1+num2))
56 # ((var4=num1+num2))
스크립트-2 : $(())
보충
#!/bin/bash
number1=2 number2=3
echo num=$number1, num2=$number2
((number1+=2))
echo num=$number1
((number2 = $number1 ** 2))
echo number2=$number2 number1=$number1
((number1++))
echo number1=$number1
실행-2
[dailycode@myComp:lab]$ ./f.sh
num=2, num2=3
num=4 # ((number1+=2))
number2=16 number1=4 # ((number2 = $number1 ** 2))
number1=5 # ((number1++))
if condition
then
process
elif condition
then process
else
process
fi
fi
는 if 문 종료를 의미한다. 반드시 작성한다.다른 프로그래밍 언어에서는 if 를 쓰면 거의 조건을()
안에 적는다.
그런데 쉘 스크립트에는 이 ()
역할을 하는 것이 3 가지나 있다.
if [ 조건문 ]
if [[ 조건문 ]]
if (( 조건문 ))
그런데 그 차이점을 하나하나 살펴 보는 건... 생각보다 알아야할 게 너무 많다.
숫자, 문자열 비교 같은 상황에서 어떻게 쓰이는지만 간단하게 알아가자.
참고: 너무 궁금하면 이 글을 참고하세요~
[ ] | (( )) | 설명 |
---|---|---|
-eq | == | equal to |
-ne | != | not equal to |
-ge | >= | not equal to |
-gt | > | greater than |
-le | <= | less than & equal to |
-lt | < | less than |
사실 []
, [[]]
도 부호를 쓸 수 있다.
하지만 부분적으로 안되는 부호 (특히 <
)들이 있다.
이런 것들을 일일이 찾아서 작성해도 무의미하다 싶어서 작성하지 않겠다.
그냥 부호를 쓸 때는 (())
를 사용하자.
예제1. if [ ]
사용 예제
#!/bin/bash
if [ $# -lt 1 ]; then
echo "need at least on argument!"
elif [ $1 -ge 0 ] && [ $1 -lt 3 ]; then
echo "0 <= ${1} < 3"
elif [ $1 -le 100 ]; then
echo "smaller or equal to 100"
elif [ $1 -gt 100 ]; then
echo "bigger then 100"
fi
예제2. if(( ))
사용 예제
#!/bin/bash
if (( $# < 1 )); then
echo "need at least on argument!"
elif (( $1 >= 0 )) && (( $1 < 3 )); then
echo "0 <= ${1} < 3"
elif (( $1 <= 100 )); then
echo "smaller or equal to 100"
elif (( $1 > 100 )); then
echo "bigger then 100"
fi
실행
[dailyCode@myComp:some]$ ./07.sh 102
bigger then 100
[dailyCode@myComp:some]$ ./07.sh 99
smaller or equal to 100
[dailyCode@myComp:some]$ ./07.sh 2
0 <= 2 < 3
[dailyCode@myComp:some]$ ./07.sh 1
0 <= 1 < 3
[dailyCode@myComp:some]$ ./07.sh
need at least on argument!
[ ] | 설명 | [[ ]] |
---|---|---|
= | 같은 지 확인 | == , = |
!= | 같지 않은지 확인 | != |
> | 더 큰지 확인 | > , > |
\< | 더 작은지 확인 | \< , < |
-n str | 문자열이 비었는지 확인 | -n str |
-z str | 문자열이 NULL 또는 길이가 0인지 검토 | -z str |
[[ ]] | 설명 |
---|---|
$var1 =~ var2 | var1 에 var2 에 있는 문자열 포함 여부 |
$var1 == var2* | var1 이후 길이 상관 없이 var2 포함여부 |
$var1 == var2? | var1 이후 문자 임의의 문자 한개 존재 여부 |
현재는 좌측 피연산자에 $
를 붙여서 변수를 사용하지만, $ 없이 쓸 수도 있다.
다만 이때는 변수가 아니라 일반 문자열로 쓰인다.
간단하게 [[ "hello world" == hello* ]] && echo YES || echo NO
3-1. 로그인 요청 예제
#!/bin/bash
read -p "Login : " login
read -p "Password : " -s password
echo ""
if [ $login = somebody ]; then
if [ $password = somebody ]; then
echo "환영합니다!"
else
echo "비밀번호가 틀렸습니다!"
fi
else
echo "아이디가 존재하지 않습니다"
fi
실행
[dailyCode@myComp:~]$ ./test.sh
Login : somebody
Password :
환영합니다!
[[]]
는 []
와 달리 정규식 비교도 가능하다.
간단한 예제를 작성하고 실행해서 확인만 하자.
예제 스크립트
#!/bin/bash
read -p "등록할 비밀번호를 입력해주세요: " pwd
if [ -z $pwd ] || [ ${#pwd} -lt 8 ]; then
echo "비밀번호는 반드시 8자 이상이어야 합니다." >&2
exit 1
fi
if [[ $pwd =~ [0-9]+ ]]; then
if [[ $pwd =~ [A-Z]+ ]]; then
if [[ $pwd =~ [a-z]+ ]]; then
echo PASSWORD=$pwd
else
echo "비밀번호는 영어 소문자를 포함해야 합니다" >&2
exit 1
fi
else
echo "비밀번호는 영어 대문자를 포함해야 합니다" >&2
exit 1
fi
else
echo "비밀번호는 0~9까지의 숫자를 하나 포함해야 합니다" >&2
exit 1
fi
실행
[dailycode@myComp:lab]$ ./test.sh
등록할 비밀번호를 입력해주세요: 123
비밀번호는 반드시 8자 이상이어야 합니다.
[dailycode@myComp:lab]$ ./test.sh
등록할 비밀번호를 입력해주세요: pgsd123452
비밀번호는 영어 대문자를 포함해야 합니다
[dailycode@myComp:lab]$ ./test.sh
등록할 비밀번호를 입력해주세요: pgsEsdf1234
PASSWORD=pgsEsdf1234
문법 | 설명 |
---|---|
-d file | 파일이 존재하고 디렉토리인지 테스트 |
-e file | 파일이 존재하는지 테스트 |
-f file | 파일이 존재하고 일반 파일인지 테스트 |
-h, -L file | 파일이 심볼릭 링크인지 테스트 |
-b file | 파일이 블록 디바이스 파일인지 테스트 |
-c file | 파일이 캐릭터 디바이스 파일인지 테스트 |
-p file | 파일이 pipe인지 테스트 |
-s file | 파일이 존재하고 비어 있지 않은지 테스트 |
-r file | 파일이 존재하고 read를 할 수 있는지 테스트 |
-w file | 파일이 존재하고 write을 할 수 있는지 테스트 |
-x file | 파일이 존재하고 execute를 할 수 있는지 테스트 |
-O file | 파일이 존재하고 현재 사용자가 작성(소유)한 것인지 테스트 |
-G file | 파일이 존재하고 기본 그룹이 현재 사용자와 같은지 테스트 |
-k file | 파일에 sticky bit가 설정되어 있는지 테스트 |
-g file | 파일에 setuid bit 가 설정되어 있는지 테스트 |
-t fd | 파일 디스크립터 fd 가 열러있는지 테스트 |
file1 -nt file2 | file1 이 file2 보다 최근 생성되었는지 테스트 |
file1 -ot file2 | file1 이 file2 보다 오래된 것인지 테스트 |
2-1. .sh 로 끝나는 파일 찾아내기
#!/bin/bash
read -p "파일 이름을 입력하세요: " filename
if [ -e $filename ]; then
echo "$filename file exists!"
if [ -f $filename ]; then
echo "this file is normal file"
fi
if [ -x $filename ];then # 파일존재 여부 + 실행가능한 파일인지도 확인
echo "this file is executable!"
fi
if [ -s $filename ]; then # 파일존재 여부 + 내용물이 있는지 확인
echo "this file has some contents!"
fi
else
echo "no such file exists!"
fi
실헹
[dailycode@myComp:lab]$ ./test.sh
파일 이름을 입력하세요: e.sh
e.sh file exists!
this file is normal file
this file is executable!
this file has some contents!
[dailycode@myComp:lab]$ touch wow.txt
[dailycode@myComp:lab]$ ./test.sh
파일 이름을 입력하세요: wow.txt
wow.txt file exists!
this file is normal file