Bashスクリプトを使用したユーザーの作成

Bashスクリプトを使用したユーザーの作成

対話型スクリプト

スクリプトは、ユーザーに作成するアカウントの数と名前のプレフィックスを尋ねる必要があります。その後、ユーザーが指定した数のアカウントを作成する必要がありますが、すでに作成されているユーザーはスキップする必要があります。

つまり、user03が存在する場合は、使用可能な次の番号user04またはuser05に移動します。 **********

以下は私が書いたスクリプトですが、期待どおりに動作しません。

#!/bin/bash
Clear
Declare -I num
Start=1
Echo -n “Enter number of accounts to be created: “
Read num
Echo -n “Enter user prefix: (student or user)”
Read pre
Echo “”
For I in { $num }
Do
    Echo “Adding user”
    Useradd -m $pre$num
    ((num++))
done

答え1

“...”大文字で表してはいけない単語(Unixのコマンド名は大文字と小文字を区別する)が含まれており、一重引用符(代わりに"...")を使用するスクリプトをワードプロセッシングプログラムに書き込んだようです。スクリプトを作成するには、より単純なテキストエディタ(たとえば、nanoまたは)を使用することをお勧めします。ウェブサイトemacsvimhttps://www.shellcheck.net/スクリプトで簡単なエラーを見つけるのに非常に便利です。

ヒントとして、すべてのコマンド名は小文字でなければならず、引用符を変更する必要があります。

ループも少し変です。一方では、ループが欲しいと思う{ $num }(何を意味するのか分からない)、一方ではnumループ内で増加します。これはnumユーザーが入力した数字なので、増やす必要はありません。ループ内の変数を更新するとしましょう。

number=1
while [ "$num" -ne 0 ]; do
   # code here that increments "number",
   # and conditionally decrements "num"
done

ユーザー名に使用されている番号を追跡し続ける必要があることに注意してください。また作成されたユーザーの数。正しい数のユーザーがいつ作成されたかを確認し、システムにすでに存在するユーザー名をスキップできるようにするには、この情報が必要です。ここで私は選ぶ削減 numという変数に、ユーザー名に使用されている数を保持しながらゼロに達するまでnumber

ループ内では、次のことを行う必要があります。努力するユーザーを作成し、$pre$number成功すると減少しますnum。各繰り返しごとに常に増加しますnumber。 0に達するまで繰り返しますnum。これは、すべてのユーザーを作成したことを意味します。

成功と失敗が正常な終了状態を返すと仮定するとadduser(注:私はLinuxユーザーではないので、既存のユーザーを作成しようとするとCentOSで何が起こるのかわかりません)、次のようにユーザーを追加できます。

if adduser -m "$pre$number"; then
    # adduser succeeded, we've created a new user, decrement num
    num=$(( num - 1 ))
fi
number=$(( number + 1 ))

またはできます提案されたユーザー名が存在することを確認してください。初めての使用getent:

if ! getent passwd "$pre$number" >/dev/null; then
    # the user don't exist, create it
    adduser -m "$pre$number"
    num=$(( num - 1 ))
fi
number=$(( number + 1 ))

getent passwd指定されたユーザー名がシステムに存在しない場合、コマンドは失敗します。ここではadduser、既存のユーザー名で呼び出すことを避けるために、この事実を利用します。

スクリプトの冒頭にあるほとんどのコードは無視しますが、num整数として宣言する必要はなく、特定のread -p 'prompt' varプロンプトを介してユーザーから値を読み取ることを指摘します。したがって、echoこれらの記述は必要ありません。

文字列$preでなくても(現在のコードの出力で提案されているように)、コードの文字列が実際に受け入れられることを考慮することもできます。studentuser

$preたとえば、スペースが含まれている場合など、ユーザー名が無効である可能性がある状況も考慮する必要があります。コードの書き方によっては、ユーザー名で解決しないと、$pre$numberアカウントを作成できないか、無制限にアカウントを作成しようとする場合があります。

関連情報