목차
1. if-then 구문 사용하기
2. if-then-else 구문 사용하기
3. 중첩된 if문
4. 테스트 명령 써보기
- 숫자비교
- 문자열비교
- 파일비교
5. 복합 테스트 검토하기
6. 고급 if-then 기능 사용하기(이중괄호/이중대괄호)
7. case 명령 알아보기
일반 코드의 if-then 과 달리, bash 쉘은 if 문에 정의된 명령을 실행하고 명령의 종료상태가 0이라면 then 아래있는 명령이 실행되고 명령의 종료상태가 1이라면 then 아래에 있는 명령은 실행되지 않고 그 다음 명령으로 넘어갑니다.
#!/bin/bash
if pwd => 명령 실행 결과 종료상태가 1이라면
then
echo "it worked" => 실행
fi
then 구문에 명령어 여러개를 넣을 수도 있습니다.
#!/bin/bash
testuser=Christine (존재하는 사용자)
if grep $testuser /etc/passwd
then
echo "this is my first com"
echo "this is my second com"
echo " i can even put in other commands besides echo:"
ls -a /home/$testuser/.b*
fi
/etc/passwd에 존재하는 사용자 Christine이 존재한다면 텍스트 3줄과 사용자 home디렉토리에 있는 bash 파일목록을 출력하고, 만약 testuser에 존재하지 않는 사용자를 입력하면 아무일도 일어나지 않습니다.
#!/bin/bash
testuser=notuser (존재하는 사용자)
if grep $testuser /etc/passwd
then
echo "this is my first com"
echo "this is my second com"
echo " i can even put in other commands besides echo:"
ls -a /home/$testuser/.b*
else
echo "the user $testuser does not exist on this system"
fi
일반 if-then 구문과 달리 만약 testuser에 존재하지 않는 사용자를 입력하면 사용자가 없다는 텍스트를 출력합니다.
중첩된 if문은 if-then-else 문의 else 안에 then구문을 위치시킵니다.
#!/bin/bash
testuser=notuser (존재하는 사용자)
if grep $testuser /etc/passwd
then
echo "this is my first com"
echo "this is my second com"
echo " i can even put in other commands besides echo:"
ls -a /home/$testuser/.b*
else
echo "the user $testuser does not exist on this system"
if ls -d /home/$testuser/
then
echo "however, $testuser has a directory"
fi
fi
위 스크립트에서는 사용자 이름이 /etc/passwd 파일에서 제거되었지만 해당 사용자의 디렉토리는 시스템에 여전히 남아있음을 알 수 있습니다.
하지만 이런식으로 중첩 if-else 구문을 사용하면 코드를 알아보기 힘들다는 단점이 있습니다. 따라서 자주 사용하는 것이 elif 를 사용하는 것입니다.
#!/bin/bash
testuser=notuser (존재하는 사용자)
if grep $testuser /etc/passwd
then
echo "the user $testuser exists on this system"
elif ls -d /home/$testuser
then
echo "the user $testuser does not exist on this system"
ehco "however, $testuser has a directory"
fi
여기서 주의할점이 elif 다음에 나오는 then은 elif 문의 실행종료상태가 0일때 실행되는 구문이라는 것을 기억해야한다는 것입니다.
#!/bin/bash
testuser=notuser (존재하는 사용자)
if grep $testuser /etc/passwd
then
echo "the user $testuser exists on this system"
elif ls -d /home/$testuser
then
echo "the user $testuser does not exist on this system"
echo "however, $testuser has a directory"
else
echo "the user $testuser does not exist on this system"
echo "and, $testuser does not have a directory"
fi
또한 elif 다음 else를 사용해서 사용자/디렉토리 모두 없는 것을 구분해서 텍스트를 출력해줄 수 있습니다.
지금까지 살펴본 if-then 문은 명령 종료상태코드로만 조건을 평가할 수 있었습니다. 하지만, 테스트 명령은 if-then 구문에서 종료코드 말고도 여러가지 조건으로 테스트하는 방법을 제공합니다. 테스트 명령에 나와 있는 조건이 참으로 평가되면 테스트 명령은 종료상태코드로 0을 돌려줍니다.
테스트 명령 형식은 아래와 같습니다. condition은 테스트 명령이 평가할 일련의 명령 및 매개변수입니다.
test condition
예제는 다음과 같습니다. 테스트 명령문의 condition 부분을 비워놓으면 0이 아닌 종료상태코드를 반환하므로 else 블록문으로 넘어갑니다.
#!/bin/bash
if test
then
echo "no expression returns a true"
else
echo "no expression returns a false"
fi
#!/bin/bash
my_variable="FULL"
if test $my_variable
then
echo "$my_variable expression returns a true"
else
echo "$my_variable expression returns a false"
fi
my_variable 변수는 내용(FULL)을 포함하고 있으므로 테스트 명령이 조건문을 검사할때 종료상태코드는 0입니다.my_variable=""
이라면 else문에 있는 구문을 출력할것입니다.
또한, bash 쉘은 이것 말고도 if-then 구문에서 조건을 테스트하는 다른 방법을 제공합니다. 바로 대괄호를 사용하는 것입니다. 이 대괄호 안에서는 숫자비교/문자열비교/파일비교
를 할 수 있습니다.
주의할점!!
bash 쉘에서 처리할 수 있는 숫자는 정수뿐입니다. 따라서 조건 테스트를 할 때 부동소수점 값을 사용할 수 없습니다.
문자열이 일치하는지를 확인하고 싶다면 부등호(= or !=
) 사용할 수 있습니다.
하지만 문자열의 크고 작음을 보고 싶다면 조금 복잡해질 수 있습니다.
부등호 기호를 이스케이프해야합니다
예제문은 다음과 같습니다. 이 예제문에서 bash 쉘은
>(부등호)
를 리다이렉트 기호로 해석했기 때문에ls -l hockey
로 확인하면 파일이 생성된것을 확인 할 수 있습니다.#!/bin/bash val1=baseball val2=hockey if [ $val1 > $val2 ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi
따라서 우리는 이렇게 스크립트를 변경해야합니다.
#!/bin/bash val1=baseball val2=hockey if [ $val1 \> $val2 ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi
어느 것이 더 큰지 순서를 결정하는 논리는 sort 명령에서 쓰이는 것과 같지 않습니다.
$ sort testfile testing Testing
sort 명령어를 사용하면 소문자가 대문자보다 먼저 출력됩니다. 정렬기준이 소문자 먼저인 것입니다. 하지만 비교테스트에서는 대문자가 소문자보다 작은것으로 나타나서 대문자가 먼저 출력됩니다.
마지막으로 문자열 크기를 보고 싶다면 -n, -z 를 사용할 수 있습니다.
if [ -n $val1] => val1 변수의 길이가 0이 아닌지 판단합니다.
if [ -z $val2] => val2 변수의 길이가 0인지 판단합니다.
if-then 구문을 사용하면 두가지 부울 연산자를 사용할 수 있습니다. AND,OR 입니다.
if [ -d $HOME ] && [ -w $HOME/testing ]
then
echo "the file exists and you can write to it"
else
echo "i cannot write to the file"
fi
사용자의 $HOME 디렉토리가 있는지 && 사용자의 $HOME 디렉토리에 testing 이라는 파일이 있는지,사용장가 파일에 대한 쓰기 권한이 있는지
확인
val1=10
if (( $val1 ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "the squre of $val1 is $val2"
fi
이중대괄호안의 부등호는 이스케이프가 필요없습니다.
if [[ $USER == r* ]]
then
echo "hello $USER"
else
echo "sorry i dont know you"
fi
$USER 가 r로 시작하는지를 대조해봅니다.
case varaiable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;