스터디 : 리눅스 커맨드라인 쉘 스크립트 바이블 12장

호밀빵 굽는 쿼카·2022년 9월 4일
0

목차

1. if-then 구문 사용하기

2. if-then-else 구문 사용하기

3. 중첩된 if문

4. 테스트 명령 써보기

  • 숫자비교
  • 문자열비교
  • 파일비교

5. 복합 테스트 검토하기

6. 고급 if-then 기능 사용하기(이중괄호/이중대괄호)

7. case 명령 알아보기

if-then 구문 사용하기

일반 코드의 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에 존재하지 않는 사용자를 입력하면 아무일도 일어나지 않습니다.

if-then-else 구문 사용하기

#!/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문은 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 !=) 사용할 수 있습니다.

하지만 문자열의 크고 작음을 보고 싶다면 조금 복잡해질 수 있습니다.

  • 부등호 기호를 이스케이프해야합니다. 그렇지 않으면 쉘은 이를 리다이렉트 기호로 해석해서 문자열 값을 파일이름으로 사용합니다.
  • 어느 것이 더 큰지 순서를 결정하는 논리는 sort 명령에서 쓰이는 것과 같지 않습니다.

부등호 기호를 이스케이프해야합니다

예제문은 다음과 같습니다. 이 예제문에서 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 이라는 파일이 있는지,사용장가 파일에 대한 쓰기 권한이 있는지 확인

고급 if-then 기능 사용하기

수학표현식을 위한 이중괄호

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 명령 알아보기

case varaiable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
profile
열심히 굽고 있어요🍞

0개의 댓글