私は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 "$@" ]
期待どおりに機能しませんでした。引用された各個別のコマンドライン引数に拡張され、本質的に3つの引数のように見えるテストを"$@"
提供します。[ -z "f132a99" "f132a98" "f132a97" ]
ユーザーが1つのパラメータのみを提供できるようにするには、上記のように正確に実行する必要があります。あなた自身の答えにつまり、同様のテストを使用して[ "$#" -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
ユーザーIDとして入力すると、無効なユーザーIDとして検出されません(bill
文字列がダッシュで始まる場合、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