wait
wait
명령은 child process가 실행 종료 후, 자원 반납까지 기다린다.
#!/bin/bash
for ((i=0; i<3; i++)); do
(
echo $((10-i))
sleep $((10-i))
)&
done
wait
wait -n
wait
에 -n
옵션을 붙이면, child process 1개 기다리고 그 process의 return 값을 return 한다.
#!/bin/bash
for ((i=0; i<3; i++)); do
(
echo $((10-i))
sleep $((10-i))
)&
done
wait -n
echo $?
wait -n
echo $?
wait -n
echo $?
- thread run, join과 비슷
$!
사용 시 주의
$!
는 항시 제일 늦게 '실행한' child pid만을 가지고 있음
| while read line
실행 문제
|
pipe 로 연결된 명령들은 subshell에서 실행된다!!!
따라서 |
PIPE 연결한 명령의 & (bg) 실행은 밖 wait에서 안기다린다!
cat ${COMMAND_FILE} | while read line; do
eval "${line} do something" &
done
wait
awk 를 이용해 많은 양 처리하자
LINE_NO=$(cat 'file' | wc -l)
for ((i=1; i<=${LINE_NO}; i++)); do
THIS_LINE=$(awk "NR==$i" ${COMMAND_FILE})
"많은 양 처리" &
done
wait
shift
shift
명령은 $1이 보는 것을 오른쪽으로 옮기는 것이라 보면됨
shift
는 현재 설정되어 있는 positional parameters
를 오른쪽만큼 n
이동
- 결과:
n
개의 positional parameters가 삭제된다.
- 따라서 $1이 담고 있는게 지정한
n
만큼 이동한 것을 가리킨다.
- 예외 상황: 현재 positional paramters 개수보다
n
값이 크면, 삭제가 일어나지 않고 종료 상태 값은 1
이된다.
$ ./script 11 22 33 44 55
echo $@
11 22 33 44 55
shift 2
echo $@
33 44 55
계속 shift 하면
echo $@ 해도 empty
while [ $# -ne 0 ]; do
echo "$#" "$1" "`which $1`"
shift
done
$ ./script ls vi sed
3 ls /bin/ls
2 vi /usr/bin/vi
1 sed /bin/sed
-> $# == 0 -> 종료
select
- select 문을 사용하여 메뉴를 쉽게 생성할 수 있다.
select CMD in ls vi sed
do
echo "You selected $CMD ($REPLY)"
done
1) ls
2) vi
3) sed // 메뉴가 표시되고
You selected ls (1)