System/Shell Script

[쉘 스크립트] sed, if, read, case

Yoonsoo Park 2024. 11. 18. 13:39

**해당 포스트는 Ubunto 22.04와 xShell을 기반으로 진행한 포스팅입니다. 

 

1. sed

: 파일 내의 특정한 값을 찾아 치환하는 명령어 

 

실습) ubunto에서 네트워크 정보가 들어있는 /etc/netplan/00-installer-config.yaml 파일의 정보를 sed를 이용하여 변경해보자(yaml 형식이라 형식이 조금만 잘못 바뀌어도 오류가 생기기 때문에 sed를 사용해주면 편할거 같다)

sed -i 's/10.12.1.100/10.12.0.100/g' /etc/netplan/00-installer-config.yaml

// -i : 파일 직접 수정(백업 생성 안함)
// s : 지정된 패턴을 찾아 대체(substitute)
// g : 모든 해당되는 패턴을 바꾼다
=> g 플래그가 없을 경우 첫 패턴만 바뀜

 

 

2. 조건문(if - then 구문 / elif / else)

//기본 형식

if [ 조건 ]; then
	[조건이 참일 경우 실행할 구문]
elif [조건]; then
	[조건이 참일 경우 실행할 구문]
else
	[구문]
fi

 

실습) command -v 명령어를 이용하여 ifconfig라는 명령어가 있는지 확인하고, 없을 경우 net-tools 패키지를 설치하고, ifconfig를 실행하라. 만약 있다면 "ifconfig가 존재하여 실행하였습니다"라는 알림과 함께 ifconfig를 실행하라.

#!/bin/bash

if command -v ifconfig > /dev/null 2>&1; then 
//명령어를 실행했을 때, 정상적으로 실행되면(=참이면), 아래의 구문을 실행하고, /dev/null로 리다이렉션해 내용이 출력되지 않게 한다
	echo "ifconfig가 있습니다"
	ifconfig | tail -8  // 명령어 실행하고, 실행 결과를 마지막 8줄만 표시
else
	apt update 
	apt install net-tools
	echo "명령어를 설치 후 실행했습니다"
        ifconfig | tail -8
fi

 

**쉘 스크립트에서 $는 어떤 용도로 쓰일까?

 

[쉘 스크립트] $는 어떤 용도로 쓰일까?

**해당 포스트는 Ubunto 22.04와 xShell을 기반으로 진행한 포스팅입니다.    이번 포스팅에서는 쉘 스크립트에서 자주 사용하는 $의 용도에 대해 알아보자. $이 굉장히 자주 쓰이기 때문에 한번 정

qkrdbstn303.tistory.com

 

**조건 작성법(숫자 비교, 문자열 비교)

 일반적으로 쉘 스크립트에서 조건은 [ ] 안에 조건을 명시한다. 쉘 스크립트에서는 산술 비교 연산자와 문자열 비교 연산자가 다르기 때문에 알아두자. 

 

##산술 비교 연산자##

숫자 비교에는 [ ] 말고도, c언어의 연산자를 (( )) 를 통해 사용 가능하다.

ex) 기본 산술 연산자(*, %..), 증감 연산자(++, --), 삼항 연산자(result = (a>b)?a:b)..

-eq 두 값이 같으면 참
-ne 두 값이 다르면 참
-lt 왼쪽 값이 작으면 참
-le 왼쪽 값이 작거나 같으면 참
-gt 왼쪽 값이 크면 참
-ge 왼쪽 값이 크거나 같으면 참

 

##문자열 비교 연산자##

문자열 비교에는 [ ] 외에도 [[ ]]를 통해 논리 연산자(&&, ||)을 비롯한 고급 기능을 사용 가능하다. 

= 두 문자열이 같으면 참
!= 두 문자열이 다르면 참
>, < 문자열의 길이 비교
-z 문자열의 길이가 0이면 참 (빈 문자열)
-n 문자열의 길이가 0이 아니면 참

 

 

3.  read

: 변수의 값을 입력받는 명령어 

read -p "안내 문구" [변수명]
// -p : 안내 문구를 같이 삽입

 

 

4. cat, EOF

: EOF(End Of File)는 heredoc를 작성할 때 사용된다. Heredoc은 여러 줄의 텍스트를 명령어로 입력하거나, 파일에 저장할 때 자주 사용된다. << EOL 부터 다시 EOL이 나올 때까지 입력된 텍스트를 한꺼번에 저장이 가능하고, 다음 예제와 같이 리다이렉션을 이용해 긴 텍스트를 파일에 저장할 때 유용하게 사용된다. 

root@root:~/testdir# cat << EOL > EOL_test.txt
> -----------------------
> --------start----------
> -----------------------
> EOL


root@root:~/testdir# cat EOL_test.txt 
-----------------------
--------start----------
-----------------------
while read line
do
    echo "읽은 줄: $line"
done <<EOF
첫 번째 줄
두 번째 줄
세 번째 줄
네 번째 줄
EOF

읽은 줄: 첫 번째 줄
읽은 줄: 두 번째 줄
읽은 줄: 세 번째 줄
읽은 줄: 네 번째 줄

 

 

5. case 

:  변수의 값을 평가할 때, 가능한 몇 가지 값 중 하나에 해당하는지 확인해야할 경우, if-elif-else를 계속사용하는 것에 대한 대안으로 사용된다(같은 변수에 대해 계속 계산할 때). 

 

예제) 2개의 숫자와 1개의 연산자(+, -, *, /)를 입력받아 해당 연산자에 맞는 계산을 하는 case 문을 작성하시오

#!/bin/bash

read -p "first num: " n1
read -p "sec num: " n2
read -p "operator: " op

case $op in 
+ )
	echo "$(expr $n1 + $n2 )";;
- )
	echo "$(expr $n1 - $n2 )";;
\* )
	echo "$(expr $n1 \* $n2 )";;
/ ) 
	if [ $n2 -ne 0 ]; then 
		echo "$(( $1 / $2 ))" // expr와 $(( )) 두 가지 방법으로 산술 연산
	else
		echo "$n2로는 나눌 수 없습니다"
	fi
	;;
esac

 

 

힘들지만 오늘도 해낸 나를 위한 한 마디, 

"다리를 움직이지 않고는 좁은 도랑도 건널 수 없다. 소원과 목적이 있으되 노력이 따르지 않으면, 아무리 환경이 좋아도 소용이 없다. 꾸준히 노력하는 사람은 반드시 성공을 거두게 된다", Emile-Auguste Chartier

 

"누구나 시작할 때는 꿈을 꾸지만, 그 꿈을 현실로 바꾸는 것은 꾸준함을 지키는 사람의 몫이다. 유혹에 흔들리지 말고 꾸준히 나아가자!"