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 "$@" ]期待どおりに動作しません。 は"$@"引用符で囲まれた個々のコマンド ライン引数に展開され、基本的に[ -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 billybillユーザー 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

関連情報