ユーザーが有効で、現在ログインしていることを確認するスクリプトを作成しようとしています。ユーザーが有効な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