다음 줄에서는 "무한" while 루프를 실행하여 일부 숫자를 인쇄합니다.
$ bash -c 'trap stopit SIGINT; run=1; stopit() { run=0; }; while [ $run ]; do for i in {0..4}; do v=$(($i*50)); d=$(for ((k=0;k<=(5+$i);k++)); do echo -n $(($v*(($k+$i)%2))),; done); d=${d%?}; c=$(echo numbers $d); echo $c; sleep 0.1; done; done ; echo Done'
numbers 0,0,0,0,0,0
numbers 50,0,50,0,50,0,50
numbers 0,100,0,100,0,100,0,100
numbers 150,0,150,0,150,0,150,0,150
numbers 0,200,0,200,0,200,0,200,0,200
numbers 0,0,0,0,0,0
numbers 50,0,50,0,50,0,50
numbers 0,100,0,100,0,100,0,100
...
..."확장" 스크립트는 다음과 같습니다.
trap stopit SIGINT;
run=1;
stopit() {
run=0;
};
while [ $run ]; do
for i in {0..4}; do
v=$(($i*50));
d=$(for ((k=0;k<=(5+$i);k++)); do echo -n $(($v*(($k+$i)%2))),; done);
d=${d%?}; # cut final comma
c=$(echo numbers $d);
echo $c;
sleep 0.1;
done;
done ;
echo Done
while
루프가 "영원히" 실행되고 인쇄되며(실행 중인 작업) 일단 지루해지면 Ctrl-C를 눌러 중지할 수 있다는 아이디어입니다 . 하지만 내가 원하는 것은 메시지를 인쇄하는 것입니다.뒤쪽에Ctrl-C는 while 루프를 중단합니다. 위의 예에서는 이것이 echo Done
명령입니다.
위의 예에서는 Ctrl-C를 사용하여 변수를 run
0으로 설정하여 루프가 "완전히" 종료되도록 한 다음 명령을 인쇄하고 종료합니다. 불행하게도 Ctrl-C를 누르면 아무 일도 일어나지 않습니다. 즉, 루프가 계속되고 kill
명시적으로 실행해야 합니다.
위의 스크립트/라인이 Ctrl-C의 while 루프를 종료하고 최종 메시지를 인쇄하도록 하려면 어떻게 해야 합니까?
답변1
알았어, 내 생각엔:
$ bash -c 'trap stopit SIGINT; stopit() { echo Done; exit; }; while [ 1 ]; do for i in {0..4}; do v=$(($i*50)); d=$(for ((k=0;k<=(5+$i);k++)); do echo -n $(($v*(($k+$i)%2))),; done); d=${d%?}; c=$(echo numbers $d); echo $c; sleep 0.1; done; done ;'
numbers 0,0,0,0,0,0
numbers 50,0,50,0,50,0,50
numbers 0,100,0,100,0,100,0,100
numbers 150,0,150,0,150,0,150,0,150
numbers 0,200,0,200,0,200,0,200,0,200
numbers 0,0,0,0,0,0
numbers 50,0,50,0,50,0,50
numbers 0,100,0,100,0,100,0,100
numbers 150,0,150,0,150,0,150,0,150
numbers 0,200,0,200,0,200,0,200,0,200
numbers 0,0,0,0,0,0
Done
기본적으로 함수의 변수는 bash
항상 로컬 범위이고 전역 변수는 "숨겨져" 있기 때문에 "전역 변수를 깔끔하게 종료하도록 변경"하는 개념은 작동하지 않습니다. 다음을 참조하세요.
그래서 읽고 나면
...최종 명령("echo Done")을 트랩 처리기로 이동한 다음 트랩 처리기에서 직접 실행하는 것이 더 낫다는 것이 밝혀졌습니다 exit
("while 루프를 깔끔하게 종료하는 것에 대해 걱정하지 마십시오"). 나중에 인쇄하려면" 문제)