1つのパラメータしか許可できません。

1つのパラメータしか許可できません。

私は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"実行するために使用するのが最善です。passwdgetent 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

関連情報