私は Bash スクリプトの初心者で、スクリプトが正しく動作しません。修正方法や適切なコーディング方法がわかりません。ユーザーは 1 つの引数のみを入力できます。( $ nowOn f132a99
) 複数の引数を入力すると、プロンプトが表示されます。Please enter a single, valid user id: "
これを修正する方法がわかりません。
$ nowOn f132a99 = 正しい出力
$ nowOn f132a99 f132a98 = 1行目のエラー バイナリ演算子が必要です
$ nowOn f132a99 f132a98 f132a97 = 1行目のエラー 引数が多すぎます
if [ -z "$@" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$@"
fi
#user validation check
if ! grep -q "$userid" /etc/passwd >/dev/null 2>&1;then
echo
echo "The user you entered, $userid is not a valid user on this system."
exit 2
else
#login check
if ! who | grep "$userid" >/dev/null 2>&1;then
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is NOT currently logged on
exit 1
else
#login check
echo
echo `grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'` is currently logged on.
exit 0
fi
fi
下記のコードも試してみましたが、引数を複数入力すると(nowOn f132a99 f132a97
)f132a99の結果のみが表示され、残りは無視され、エコーされません。Please enter a single, valid user id:
if [ -z "$1" ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi
答え1
はい、テストは[ -z "$@" ]
期待どおりに動作しません。 は"$@"
引用符で囲まれた個々のコマンド ライン引数に展開され、基本的に[ -z "f132a99" "f132a98" "f132a97" ]
3 つの引数のように見えるテストが提供されます。
ユーザーに単一の引数のみを与えさせたい場合、あなたがすべきことはまさにあなたが言及したとおりです。あなた自身の答えでつまり、無効な入力をテストするには、 のようなテストを使用します[ "$#" -ne 1 ]
。
しかし、別の選択肢もあります。それは、全て指定された引数をユーザー ID として取得し、ループします。
if [ "$#" -eq 0 ]; then
echo 'No user ID given' >&2
exit 1
fi
for userid do
# code to process "$userid" goes here
done
コードに関するその他の注意事項:
有効なユーザーIDのテストには欠陥があります。 というユーザーがいないbill
が、はa billy
。bill
ユーザー ID として入力すると、無効なユーザー ID として検出されません(文字列がダッシュで始まるgrep -q "$userid" /etc/passwd
場合、このコマンドでもエラーが発生する可能性があります)。$userid
getent -- passwd "$userid"
を使用してテストし、passwd
データベースからデータを取得することに関連するすべての操作を を介して実行することをお勧めしますgetent passwd
。
でも同様の問題がありますがwho | grep "$userid"
、 と記述した方が適切ですwho | grep -q "^$userid\>"
。
私はこれらのことを言いました前回の質問に対する私の回答では。
答え2
以下を使用して解決しました:
if [ $# -ne 1 ]; then
echo -n "Please enter a single, valid user id: "
read userid
else
userid="$1"
fi