ユーザーが存在するかどうかを確認するスクリプトを作成したい。以下のロジックを使用しています:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
したがって、ユーザーが存在する場合、成功します。それ以外の場合、ユーザーは存在しません。上記のコマンドを以下のようにbashスクリプトに入れました:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
さて、私のスクリプトは常に、ユーザーが何に関係なく存在すると言っています。
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
上記の条件が常にTRUEと評価され、ユーザーが存在すると言うのはなぜですか?
どこがいけないの?
更新:
すべての応答を読んだ後、スクリプトに問題が見つかりました。問題は、getent
出力をリダイレクトする方法でした。だから私はすべてのリダイレクトのものを削除し、getent
行を次のようにしました:
getent passwd $user > /dev/null
今、私のスクリプトは正常に動作しています。
getent
と呼び出し先の間に「エコー」デバッグステートメントはありませんif
の文?これにより、$?
へのecho
呼び出しではなく、の終了ステータスがチェックされgetent
ます。
2>&1
代わりにという意味だと思います2&>1
。
$1
設定されていない場合、ifステートメントはtrueを返します。私のテストから、解決策は$1
二重引用符で囲むことです:getent passwd "$1" > /dev/null 2&>1
。
$?
すると、test
コマンドの戻りコードが返されると思います。以下の回答を参照してください。