자주 사용하는 Shell script 모음

이것도 정리를 해두지 않으니 매번 찾게된다.

때 될때마다 정리해두자.

특정 디렉토리의 하위 디렉토리를 Pretty printing 하기

#!/bin/sh

depth=$2

space=" "
count=1
while [ $count -le $depth ];
do
	count=$((count+1))
	space="$space    "
done;

for dir in `ls $1`
do
	if [ -d $1/$dir ]; then
# pretty printing version
		echo "$space$dir"
# full path version
#		echo "$1/$dir"
		nextdepth=$((depth+1))
		$PWD/list.sh $1/$dir $nextdepth
	fi
done

다음 명령으로 실행시킴

./list.sh <aboulte-path] 1

.svn 디렉토리 지우기

find . -name .svn -exec ls '{}' \;

for-loop 돌리기

for i in array
do 
... looping commands here ...
done

특정 문자열을 공백으로 치환해서 이를 배열로 뽑아내기

email=abc@def.xyz
tokens=(${$email//@/ })
id="${tokens[0]}"
doimain="${tokens[1]}"
  • 주의할 점은 배열로 나눌려면 각각의 토큰이 공백( )으로 구분되어야 한다는 점이다.

간단한 사칙연산하기

index=$((index+1))

이 예제는 index++과 동일한 기능을 수행한다.

가능하면 까먹지 말아야 하는데 쓰는 경우가 자주 있질않다보니…


curl을 이용해서 반복적으로 웹 API 호출하기

간단한 배치로 웹 API를 호출하는 경우가 필요한데 이런 경우에 대표적으로 이용할 수 있는 것이 curl이다.  웹 API를 호출할려면 기본적으로 이런저런 헤더 정보를 추가로 줘야하는데 그런 경우에 문자열을 표시하기 위해 따옴표(“)를 써야한다.  그런데 따옴표로 스크립트상의 파라미터를 감싸버리면 이게 명령상에서 제대로 인식하지 못하는 경우가 발생한다.

우회적인 방법으로 생각할 수 있는게 스크립트 상에서 스크립트를 만들고, 그 스크립트를 실행하는 방법으로 이를 구현할 수 있다.

#!/bin/sh
for ip in `cat ip`
do
  data=" '{ \"clientIp\": \"$ip\" }' "
  out="curl -s -X POST http://localhost:8080/api/v1/ip -H \"Content-Type: application/json; charset=utf-8\" -d $data | awk -F, '{ print \$3 };'"
  echo $out > run.sh
  chmod +x run.sh
  result=`./run.sh`
  echo $ip " " $result
done

주의할 점은 출력할 결과에 마찬가지로 따옴표 혹은 쌍따옴표가 포함되야 하는 경우에는 Backslash(\)를 이용해서 이를 별도로 표시해줘야 한다는 것! 특히나 생성되는 스크립트 파일에서 참조되는 스크립트 변수와 같은 경우에도 마찬가지로 backslash를 넣어줘야한다.


awk 사용해서 마지막 필드 출력하기

awk '{ print $NF }' filename.txt