ユーザーが有効なIDを入力するのを待つスクリプト

ユーザーが有効なIDを入力するのを待つスクリプト

ユーザーが有効で、現在ログインしていることを確認するスクリプトを作成しようとしています。ユーザーが有効なIDを入力するのを待つことはできません。


while read one
do

if id "$one" >/dev/null 2>1;

then
Matrix=$(who -u |grep -q "$one" || test && echo "logged on" || echo "not logged on")

fullname=$(grep "$one" /etc/passwd | cut -d ':' -f5 | sort -k 2 | tr ",,:" " " | awk '{print $2,$1}')

echo "$fullname is $Matrix"

else
echo "user doesnt exist"

fi
break
done
echo "maybe"

答え1

このreadユーティリティは待つデータが入力されるまで

read username

ユーザーがシェルに保存する内容を入力するまでは返されません$username

「待機」が「有効なユーザー名が入力されるまで繰り返し」を意味する場合は、次のようにします。

while true; do
    read -p 'Enter username: ' username
    if id "$username" >/dev/null 2>&1; then
        printf 'Username "%s" is valid\n' "$username"
        break
    fi
    printf 'Username "%s" is not valid\n' "$username"
    echo 'Try again...'
done

これは無限ループに入り、ユーザーが有効なユーザー名を入力した場合にのみ終了します。適切なユーティリティを使用して検証しますid。コードもそのユーティリティを使用しているようです。ユーティリティがエラーなしで終了すると、エスケープループを通過しますbreak

このループの後に、有効なユーザー名があることがわかります$username

ユーザーがログインしているかどうかをテストするには、who以前と同じように使用できます(ここでは少し変更されています)。

if who | grep -q "^$username\>"; then
    printf 'User "%s" is logged on\n' "$username"
else
    printf 'User "%s" is not logged on\n' "$username"
fi

ユーザー名は出力の最初の列にありますwho。したがって、ユーザー名を行の先頭に固定します^。また、ユーザー名の末尾に単語の境界が一致していることを確認してください\>arthur実際に検索するとユーザーを検出できませんart)。

代わりにユーティリティをwho使用できますusers

ユーザーのフルネームを取得するには:

name=$( getent passwd "$username" | cut -d : -f 5 | cut -d , -f 1 )

このgetentユーティリティは、パスワードデータベースやその中の項目などを取得するために使用されます。ここでは、関心のある特定のユーザーのパスワードデータベースエントリを取得するために使用します。次に、GECOSフィールドの最初のカンマ区切り値からフルネームを解析します。

このユーティリティを使用して有効なユーザー名をテストすることができますgetent(無効なユーザー名を使用している場合はゼロ以外の終了ステータスを返すため)、後で実行することなくプロセス中にユーザーのフルネームを取得できます。クエリを試してみてください。

総合してみると:

#!/bin/bash

while true; do
    read -p 'Enter username: ' username
    if id "$username" >/dev/null 2>&1; then
        printf 'Username "%s" is valid\n' "$username"
        break
    fi
    printf 'Username "%s" is not valid\n' "$username"
    echo 'Try again...'
done

name=$( getent passwd "$username" | cut -d : -f 5 | cut -d , -f 1 )
printf 'Full name of "%s" is %s\n' "$username" "$name"

if who | grep -q "^$username"; then
    printf '%s is logged on\n' "$name"
else
    printf '%s is not logged on\n' "$name"
fi

答え2

誤った結果をループに事前設定し、ループ内で操作を実行し、次の反復中に実際の結果を要求できます。

それは次のとおりです。

#!/bin/bash
ok=1
while [ $ok -gt 0 ]; do
    read one
    < your check of $one >
    ok=$?
done

関連情報