bash script2020. 11. 5. 13:20

 

반달가면 이글루에서 백업 - bahndal.egloos.com/440757

 

스크립트로 반복작업을 해야 하는데, A 작업을 일단 완료하고 나서 시간이 X초 이상 흘렀으면 B 작업을 하고 아직 안 지났으면 C 작업을 해야 하는 좀 애매한 상황이 있어서 이걸 처리하려고 생각한 방법이다.

date 명령에서 출력 형식에 %s 옵션을 사용하면 UTC 기준 1970년 1월 1일 00시 00분 00초부터 몇초가 흘렀는지를 표시해 주는데, 이것을 이용했다. 아래의 예시 스크립트를 참고하자.

# 예시: A작업후 10초 이상 흘렀으면 B작업 실행, 아니면 C 작업 실행
start_time=`date "+%s"`
echo "A작업을 수행합니다!"
# A작업 수행
...
stop_time=`date "+%s"`
# 경과한 시간 = 종료시간 - 시작시간
interval=`echo "$stop_time - $start_time" | bc`
if test $interval -ge 10
then echo "10초 이상 경과. B작업을 수행합니다!"
# B작업 수행
...
else echo "아직 10초 안 됐음. C작업을 수행합니다!"
# C작업 수행
...
fi

 

나노초(nanosecond)를 표시하는 %N 옵션을 이용하면 간단한 스톱워치도 구현 가능. 아래의 예시를 참고하자.

#stopwatch.sh
echo "press ENTER to start"
read enter
start_time=`date "+%s.%N"`
echo "press ENTER to stop"
read enter
stop_time=`date "+%s.%N"`
result=`echo "$stop_time - $start_time" | bc`
echo "$result sec"

 

 

728x90

'bash script' 카테고리의 다른 글

[bash: function] 함수 만들기  (0) 2020.11.10
[bash: grep] 정규표현 비활성화  (0) 2020.11.09
[bash: -x] 스크립트 디버깅  (0) 2020.11.03
[bash: awk] 단어 위치 바꾸기  (0) 2020.11.03
[bash: seq] 연속적인 수 생성  (0) 2020.10.28
Posted by 반달가면
bash script2020. 11. 3. 16:53

 

반달가면 이글루에서 백업 - bahndal.egloos.com/440518

 

작성한 셸 스크립트의 동작이 뭔가 이상할 때, 어느 부분에 문제가 있는지 찾기 위해 -x 옵션을 활용할 수 있다.

 

작성한 스크립트가 my_script.sh라고 하면, 아래와 같이 실행해 보자.

 

bash -x my_script.sh

 

스크립트가 실행되면서 명령어와 각 변수에 할당된 값들이 화면에 출력된다. 스크립트 실행 중간에 오류가 나서 종료되는 상황이라면 오류가 발생하기 직전까지의 실행 결과를 볼 수 있다.

 

개인적으로는 이 출력 내용을 다른 파일로 저장한 후 차근차근 살펴보는 식으로 사용하는데, 좀 길고 복잡한 스크립트를 만들어야 할 경우에 꽤 도움이 된다. 출력 결과를 my_script.log 파일에 저장하려면 아래의 예를 참고하자.

 

bash -x my_script.sh > my_script.log

 

 

728x90
Posted by 반달가면
bash script2020. 11. 3. 16:49

 

반달가면 이글루에서 백업 - bahndal.egloos.com/439244

 

그냥 예제를 하나 적어두는 것이 가장 나을 것 같다.

 

예를 들어 people.txt 파일의 내용이 아래와 같이 이름::이메일::나이 형태라고 해 보자.

 

john::john@mail.com::24

mary::mary@mail.com::22

 

이것을 이메일[탭]이름[탭]나이 형태로 바꿔서 result.txt 파일에 저장하려고 한다. 아래와 같이 하면 되겠다.

 

cat people.txt | awk -v FS="::" -v OFS="\t" '{ print $2,$1,$3 }' > result.txt

 

-v 옵션으로 awk의 내부 변수를 설정해 주는데, FS는 입력에 적용하는 항목 구분자(field separator)이고 OFS는 출력에 적용하는 항목 구분자이다.

 

FS에 지정된 구분자를 기준으로 첫번째 항목은 $1에, 두번째 항목은 $2에 대응된다. 위의 예시를 기준으로 보면 $1은 이름, $2는 이메일에 대응될 것이다.

 

이름과 이메일의 순서를 바꿔야 하므로 print 명령에서 순서를 $2,$1,$3 이렇게 했다. 그리고 이 결과를 result.txt로 저장.

 

result.txt의 내용은 아래와 같이 될 것이다.

 

john@mail.com john 24 mary@mail.com mary 22

 

 

728x90
Posted by 반달가면
bash script2020. 10. 28. 13:22

 

반달가면 이글루에서 백업 - bahndal.egloos.com/434343

 

특정 범위의 수자를 차례로 만들어야 할 때는 seq 명령을 쓰면 되겠다. 형식은 아래와 같다.

seq [시작번호] [끝번호]

seq [시작번호] [간격] [끝번호]

아래의 예시를 보자.

# 3부터 7까지 순서대로 출력
seq 3 7
3
4
5
6
7

# 3부터 10까지 2 간격으로 출력
seq 3 2 10
3
5
7
9

for 명령을 이용한 반복작업에도 활용할 수 있다.

start_num=3
end_num=10
interval=2
for i in `seq $start_num $interval $end_num`
do
echo "the number is $i"
done

 

728x90
Posted by 반달가면