-
[Shell Script] 셸 스크립트(Shell Script) 기본 문법 정리Shell Script/Bash Script 2021. 4. 21. 15:50728x90반응형
Shell Script 및 리눅스 일부 문법 정리
RESPONSE_CODE=$(sudo curl -s -o /dev/null -w "%{http_code}" http://localhost:8080)
/dev/null
: 위의 명령어가 성공했다면 아무 것도 뜨지 않고 실패하면 에러 메세지가 출력됩니다.curl
: 해당 URL로 요청을 보내는 명령어(-s, -o, -w은 더 찾아보기)"%{http_code}"
: URL 요청의 HTTP Status Code를 파싱하게 된다. 즉, RESPONSE_CODE에 해당 상태 값이 담깁니다.
if-else문
if [ ${RESPONSE_CODE} -ge 400 ] # 400 보다 크면 (즉, 40x/50x 에러 모두 포함) then CURRENT_PROFILE=real2 else CURRENT_PROFILE=$(sudo curl -s http://3.36.209.141/) fi
if문
: if 문안에 [] 안에 위와 같이 반드시 띄어쓰기를 해야 에러가 발생하지 않습니다.then
: if문 뒤에 써주어야 할 것입니다.fi
: if문이 끝났음을 알리는 것입니다.
if [ -z ${IDLE_PID} ]
-z 옵션
: if 문안에-z 옵션
을 사용하면 해당IDLE_PID
가 null이면 true, null이 아니면 false를 반환합니다.
함수(function)
function find_idle_profile() { RESPONSE_CODE=$(sudo curl -s -o /dev/null -w "%{http_code}" http://3.36.209.141/) if [ ${RESPONSE_CODE} -ge 400 ] # 400 보다 크면 (즉, 40x/50x 에러 모두 포함) then CURRENT_PROFILE=real2 else CURRENT_PROFILE=$(sudo curl -s http://3.36.209.141/) fi if [ ${CURRENT_PROFILE} == real1 ] then IDLE_PROFILE=real2 else IDLE_PROFILE=real1 fi echo "${IDLE_PROFILE}" }
Bash 스크립트
는 값을 return 하는 기능이 없습니다. 그래서 제일 마지막 줄에echo
를 이용해서 결과를 출력하면 클라이언트에서 그 값을 잡아서 `$(find_idle_profile)) 사용합니다.- 중간에
echo
를 사용해서는 안됩니다.
function find_idle_port() { IDLE_PROFILE=$(find_idle_profile) # find_idle_profile 함수에서 마지막에 echo로 출력한 것을 이렇게 사용하면 값을 return 받은 효과를 얻습니다. if [ ${IDLE_PROFILE} == real1 ] then echo "8081" else echo "8082" fi }
- find_idle_profile 함수에서 마지막에 echo로 출력한 것을 이렇게 사용하면 값을 return 받은 효과를 얻습니다.
source란?
source /home/ec2-user/app/profile.sh
위와 같이 상단에
source
를 이용해서 적어주면 java로 치면 import와 같은 역할을 하게 됩니다. 즉 현재 파일에서profile.sh
를 import 한 것입니다.for-in문
for 변수명 in {1..10} ex) for RETRY_COUNT in {1..10}
- 셸 스크립트에서 for문은 위와 같이 사용할 수 있습니다.
echo란?
- C언어에서 printf와 같이 화면에 출력을 하는 기능입니다.
- 위에서 보았던 것처럼 Bash 스크립트 함수에서 클라이언트가 echo의 출력 값을 사용할 수 있도록 하는 역할을 합니다.
echo "set \$service_url http://3.36.209.141:${IDLE_PORT};" | sudo tee /etc/nginx/conf.d/service-url.inc
- echo의 출력 결과를 |(파이프라인)을 만들어서 해당 경로에 쓰도록 할 수도 있습니다.
dirname 이란?
dirname
은 리눅스 명령어입니다. 이름에서 알 수 있듯이 디렉터리 경로를 출력하는 명령어입니다. 하지만 마지막에 존재하는 경로는 출력하지 않는다는 특징이 있습니다 .dirname
은 위와 같이 마지막에 존재하는 경로를 제외하고 출력을 합니다. (실제로 home, ec2-user, app 모두 디렉터리 인데도 app은 출력되지 않습니다.)
- 이번에는 마지막에 존재하는 것이 파일인데 결과는 위와 같게 나오는 것을 볼 수 있습니다.
lsof란?
lsof -ti tcp:포트번호 ex) sudo lsof -ti tcp:8080
위의 명령어를 통해서 현재 실행 중인 포트의
PID
를 확인할 수 있습니다.wc 명령어
- wc 명령어에서 -l 옵션이 존재합니다. -l 옵션은 해당 명령어의 결과의 수를 숫자로 반환해줍니다. (즉, 결과가 3줄이면 3을 반환합니다.)
echo real | grep real | wc -l # 결과: 1
위와 같이 하나의 결과만 출력되는 것을 볼 수 있습니다. 여기에
wc -l
까지 같이 넣어서 출력해보겠습니다.위와 같이 한 줄의 출력이라서 결과도
1
이 나온 것을 볼 수 있습니다.readlink 명령어
ABSDIR=$(readlink -f $0)
위의 코드를 보았을 때 어떤 뜻이지? 하면서 좀 더 찾아보고 테스트를 해보았습니다.
현재
/home/ec2-user
위치에deploy.sh
파일에 위의 내용을 입력한 후에 만들겠습니다.그리고
sh ./deploy.sh
명령을 통해서 스크립트 파일을 실행시켜 보면 위와 같이 결과가 나옵니다.$0
: 상대 경로로 현재 파일의 위치가 나옵니다.readlink -f $0
: 절대경로로 해당 파일의 위치가 출력됩니다. (즉, $0 파일의 실제 경로를 알려주는 역할입니다.)
반응형