
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