web-dev-qa-db-ja.com

ユーザーが禅リストで「終了」をクリックしたかどうかを検出する方法

これは私のコードです:

while true; do
    choice=$(zenity --list --text "Users are listed below." --title "Result" --ok-label="Back to Menu" --cancel-label="Quit" --column=Users $(cut -d : -f 1 /etc/passwd))
    if [ "$choice" = "root" ]
        then    
            echo 'You have clicked on root'
    fi
    if [["$?" = "Quit"]]
        then
            exit
    fi
done

ご覧のとおり、最初にシステム上のアクティブなユーザーのリストが表示されます。ユーザーが「ルート」をクリックした場合は「あなたはルートをクリックしました」と表示し、ボタンをクリックした場合は何か他の操作を実行します(「終了」および「メニューに戻る」など)。

注:よく検索しましたが、関連する質問が山ほどあります。しかし、私の質問に対する正確な答えはありません。

編集:コードを変更しましたが、問題は何もエコーしないことです。

while true; do
choice=$(zenity --list --text "Users are listed below." --title "Result" --ok-label="Back to Menu" --cancel-label="Quit" --column=Users $(cut -d : -f 1 /etc/passwd))

if [ "$?" != 0 ]
then
    exit
fi

if [ "$choice" = "root" ]
then    
    echo 'You have clicked on root'
fi
done

それが関連しているかどうかはわかりません。しかし、私はubuntu 18.04を使用しています

編集2:bash -xを使用してスクリプトを実行しましたが、結果は here です。

$?は終了ステータスで、整数であり、「Quit」になることはありません。ただし、ユーザーが[終了]をクリックした場合、zenityはステータス1で終了し、ユーザーが[OK]ボタンをクリックした場合は0で終了します。

$ choice=$(zenity --list --text "Users are listed below." --title "Result" --ok-label="Back to Menu" --cancel-label="Quit" --column=Users $(cut -d : -f 1 /etc/passwd))
# clicked Quit
$ echo $?
1

だからあなたができる:

choice=$(zenity --list --text "Users are listed below." --title "Result" --ok-label="Back to Menu" --cancel-label="Quit" --column=Users $(cut -d : -f 1 /etc/passwd))

if [ "$?" != 0 ]
then
    exit
fi

if [ "$choice" = "root" ]
then    
    echo 'You have clicked on root'
fi

0と比較することをお勧めします。他の障害状態により、0または1以外の終了ステータスが発生する可能性があるためです。

2
muru