bash 出力の解析

bash 出力の解析
#!/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成功と見なされ、そうでなければ失敗と見なされます。

編集:小さなタイプミスを作成してリダイレクタの順序を変更しました>&

おすすめ記事