![bash 출력 구문 분석](https://linux55.com/image/153930/bash%20%EC%B6%9C%EB%A0%A5%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D.png)
#!/bin/bash
start(){
printf 'Real IP: %s\n' "$(curl -s ifconfig.co)"
set -- /etc/openvpn/ovpn_tcp/*.nordvpn.com.tcp.ovpn
shift $(( RANDOM % $# ))
screen -S vpn -dm openvpn "$1" # connect
sleep 5 # wait for connection
printf 'VPN IP: %s\n' "$(curl -s ifconfig.co)"
}
stop(){
screen -S vpn -X quit
pkill -f ovpn
}
status(){
printf 'Current IP: %s\n' "$(curl -s ifconfig.co)"
}
case "$1" in
start)
if screen -ls | grep -w vpn &> /dev/null; then
echo "VPN Already Connected";
status
else
start
fi
;;
stop)
stop
;;
*)
status
;;
esac
입력하면 이전 bash
스크립트는 다음과 같은 답변을 제공합니다 vpn stop
.
vpn stop
활성 연결이 있는 경우 다음을 vpn
실행합니다.
[root@A ~]# vpn stop
Terminated
vpn stop
활성 연결이 없으면 vpn
다음을 실행합니다.
[root@A ~]# vpn stop
No screen session found.
Terminated
내가 달성하고 싶은 것은 다음과 같습니다
vpn stop
활성 연결이 있는 경우 다음을 vpn
실행합니다.
[root@A ~]# vpn stop
VPN Connection Closed Successfully
vpn stop
활성 연결이 없으면 vpn
다음을 실행합니다.
[root@A ~]# vpn stop
There's No Active VPN Connection to stop it.
답변1
stop 명령의 종료 신호를 확인해야 합니다.
stop(){
screen -S vpn -X quit >/dev/null 2>&1
if [ "$?" == 0 ]; then
echo "VPN Connection Closed Successfully"
else
echo "There's No Active VPN Connection to stop it."
fi
pids=( $(pgrep -f ovpn) )
for pid in "${pids[@]}"; do
if [[ $pid != $$ ]]; then
kill "$pid"
fi
done
}
Bash는 마지막으로 실행된 명령의 종료 신호를 $?
변수에 저장합니다. 표준에 따르면 중요한 종료 신호는 모두 0
성공으로 간주되고, 그렇지 않으면 실패로 간주됩니다.
편집: 작은 오타를 만들어 리디렉터의 순서를 변경했습니다 >&
.