各ユーザーのアカウントを作成し、テキストファイル内のそのグループにユーザーを追加します。

各ユーザーのアカウントを作成し、テキストファイル内のそのグループにユーザーを追加します。

username.txtユーザー名と特定のグループを含むファイルがあります。現在、私は各ユーザーのアカウントを作成し、単一のコマンドでそのユーザーをそのグループに追加できるbashスクリプトを作成しようとしています。

これは現在失敗したbashスクリプトです。

#!/bin/bash

sudo addgroup staff
sudo addgroup visitors

username="username.txt"

while read line; do
sudo useradd $-Eo '^[^,]+' $username;
if [grep staff $username]; then
  sudo usermod -a -G staff
else
  sudo usermod -a -G visitors
done < $username

私のファイルの内容は次のとおりですusername.txt

ellipsiscoterie,visitor
magnetcommonest,visitor
belateddefensive,staff
bobstercaramelize,staff

答え1

これを解決策として試してください。カンマ区切りのファイルを使用しているので、一度に複数のグループを使用したいとします。あなたがやっていることはまったく間違っているわけではありませんが、if elseより多くのグループが必要な場合は再作成する必要があるため、この場合は使用しません。グループ生成もループ内で処理されます。

#!/bin/bash
while read config
do
        USERTOCREATE=$(awk -F, '{print $1}' <(echo "$config"))
        GROUPTOASSIGN=$(awk -F, '{print $2}' <(echo "$config"))
        if [[ ! $(groups) =~ $GROUPTOCREATE ]]; then addgroup $GROUPTOASSIGN; fi
        useradd $USERTOCREATE
        usermod -a -G $GROUPTOASSIGN
done < users

whileこのコードは、2つの変数を使用しUSERTOCREATEてawkを使用して割り当てる単純なループですGROUPTOASSIGN-F,awk のフラグは、フィールド区切りFS変数をコンマに設定します。これにより、awkは入力を変数$ 1と$ 2に分割できます。これに慣れているかどうかはわかりませんが、これはファイルの出力をファイルとして<()扱うことができるファイル記述子です。スクリプトが読み込んでいるファイルの行だけで済みます。echo "$config"$config

答え2

#!/bin/bash
i=0

n=$(wc -l <username.txt)
while [ $i -le $n ]
do
        L=$(awk "NR==$i" username.txt)
        if [ -n "$L" ]; then
                user=$(echo "$L" | cut -d',' -f1)
                group=$(echo "$L" | cut -d',' -f2)
                useradd $user
                groupadd $group
                usermod -a -G $group $user
        fi

i=$((i+1))
done

答え3

username.txtフィールド区切り文字を使用して1行ずつ解析できます,

#!/bin/bash
sudo addgroup staff
sudo addgroup visitors

while IFS=, read -r username maingroup
do
   sudo adduser --ingroup "$maingroup" "$username"
done < username.txt

これは、コンマで区切られたトークンをシェル変数として読み取り、$usernameコマンドを実行してデフォルトグループを持つユーザーを$maingroup作成します。adduser$username$maingroup

関連情報