#!/bin/bash 스크립트에서 자주사용하는 명령어 echo, sed 및 특수문자

| 2021년 5월 29일 | 0 Comments

안녕하세요 기술지원팀 이정호 사원입니다.

보통 리눅스에서 스크립트를 짤때, 설치 스크립트, 백업 스크립트 등 여러 스크립트들이 있습니다.

보통 apache 설치 스크립트, MySQL or MariaDB 설치 스크립트, php 설치 스크립트들을 주로 사용합니다.

스크립트에서 자주 사용하는 명령어들은 echo, sed입니다. 함수부분 if, elif, fi, else, case 등 여러 함수도 있습니다.

그중 echo에 대해 설명드리겠습니다. 

 

echo

 

echo로 새로운 파일, 또는 파일에 추가적으로 입력값들을 넣는 경우가 있습니다.

ex1) echo “systemctl restart mysqld” > /home/test/testscirpt.sh

해당 명령어는 MySQL를 재시작하는 명령어를 /home/test/testscirpt.sh에 기존의 있는 내용들을 다 삭제하고 해당 명령어를 넣겠다는 의미 입니다.

ex2) echo “systemctl restart mysqld” >> /home/test/testscirpt.sh

해당 명령어는 MySQL를 재시작하는 명령어를 /home/test/testscirpt.sh에 기존의 있는 내용의 다음줄에 추가하겠다는 의미입니다.

ex3) echo systemctl restart mysqld >> /home/test/testscirpt.sh

예시 2번째와 3번째는 ” ” 있는지 없는지 차이입니다. 그러나 systemctl restart mysqld 글자는 일반적인 특수문자가 아닌 문자로 똑같이 출력이 됩니다.

ex4) echo ## >> testscript.sh

ex5)echo “##” >> testscript.sh

ex6)echo ‘##’ >> testscript.sh

#는 특수문자로 echo ##하면 공백처리로 인식되어 결과적으로 아무것도 실행되지 않습니다. 그렇기 때문에 #는 보통 주석처리로 이용되는 부분을 스크립트파일에 문자 그대로 넣기위해서는 “(쌍따옴표), ‘(따옴표)를 사용하여 감싸야합니다.

둘의 차이점입니다.

따옴표(‘ ‘)로 감싸진 문자열은 문자열 그대로 유지되어 출력됩니다. (Bash 변수 사용 불가능합니다.)

쌍따옴표(” “)로 감싸진 문자열 내에서는 Bash 에서 선언한 변수사용이 가능합니다.

따옴표에서는 특수기호 이스케이핑을 해주지 않아도 문자 그자체로 출력이 가능합니다.

 

따옴표(‘ ‘)를 사용해야 할때

1. 문자열 그 자체가 출력하고 싶을때
2. 특수문자가 많이 포함된 문자열의 경우, 백슬래시(\)를 사용해가며 일일이 Escaping을 해주기 귀찮을때

쌍따옴표(” “)를 사용해야 할때

1. 문자열 내에 Bash 변수를 삽입해 새로운 문자열을 동적으로 만들어 내야 할 때
2. \n, \t, \a 와 같이 이스케이프 코드를 삽입해야 할 때

입니다.

 

sed

 

sed에 대해 설명해드리겠습니다. sed는 기존의 파일에서 치환하고 싶을 때 사용하는 명령어입니다.

ex1) sed -i ‘s/<VirtualHost _default_:443>/#<VirtualHost _default_:443>/g’ /home/test/test-ssl.conf

위에 명령어를 설명해드리겠습니다.

/homn/test/test-ssl.conf이라는 파일에 <VirtualHost _default_:443>이 있으면 전부해당 내용을

#<VirtualHost _default_:443>로 치환하겠다는 의미입니다.

해당 구조를 설명해드리자면

sed -i ‘s/파일내에서 바꿔야할 기존내용/파일내에서 바꿔야할 새로운내용/g’ 파일명 

입니다. 

ex2) sed -i ‘s/DocumentRoot “\/usr\/local\/apache\/htdocs”/#DocumentRoot “\/usr\/local\/apache\/htdocs”/g’ /home/test/test-ssl.conf

위에 예시에 빨간색이 파일내에서 바꿔야할 기존내용, 파란색이 파일내에서 바꿔야할 새로운내용, 주황색이 파일명입니다.

여기서 sed 에서 ‘ /  ‘ 는 기존내용, 새로운내용은 구분하기위한 문자로 /usr/local/apache/htdocs 라는 파일위치표현을 \/usr\/local\/apache\/htdocs 이렇게 표현해야합니다.

만약 위에처럼 명령어를 치지 않는다면 오류가 발생합니다.

잘못된 예시 ex3) sed -i ‘s/DocumentRoot “/usr/local/apache/htdocs”/#DocumentRoot “/usr/local/apache/htdocs”/g’ /home/test/test-ssl.conf

이상입니다. 감사합니다.

Category: LINUX

Avatar

About the Author ()