ここに閉じ込められており、解決策が見つかりませんでした。
ユーザーが /etc/passwd にあることを確認し、そうである場合は、プレフィックス new_the_existed_one を使用して新しいユーザーを作成します。
#!/bin/bash
myuser="/home/yakyak/Desktop/Exercises/newusers.txt"
sed '/^[ \t]*$/d' $myuser | while read -r line
do
name="$line"
# adduser --disabled-login --gecos "" $name
# check if user exist
isthere=$(cut -d: -f1 /etc/passwd | grep "$name")
# if user was added then make insert record into log file
if [[ "$isthere" == "$name" ]]
then
echo "User already exist, creating new user.."
adduser --disabled-login
# adduser --disabled-login --gecos " " $name
fi
done
ベストアンサー1
#!/bin/bash
NAME_REGEX='^[a-z][-a-z0-9]*$' # default value for adduser.conf
. /etc/adduser.conf # "source" it in case local config is different
myuser='/home/yakyak/Desktop/Exercises/newusers.txt'
grep "$NAME_REGEX" "$myuser" | while read -r name; do
while getent passwd "$name" > /dev/null; do
name="new_$name"
done
# check if $name is > 32 characters
if [ "${#name}" -gt 32 ] ; then
echo "username '$name' is too long" > /dev/stderr
else
adduser --disabled-login --gecos '' "$name"
fi
done
sed
ファイルから空白行を削除するために使用されませんが、無効なユーザー名を除外するためにnewusers.txt
使用されます。grep
いいえというシェル変数に保存されているパターンと一致します$NAME_REGEX
。adduser
「有効」を定義するには、それと同じ変数名(および正規表現パターン)を使用します。表示man adduser.conf
と検索NAME_REGEX
$ nameがpasswdデータベースに存在しなくなるまで、$ nameの前に "new_"が追加され続けます。 「user」が存在する場合は「new_user」を試みます。 「new_user」が存在する場合は、「new_new_user」を試みます。それから「new_new_new_user」があります。など。
スクリプトはgetent passwd
終了コードを使用しますが、興味だけです。出力は削除されます(/dev/nullにリダイレクトされます)。 getentが0(true)で終了すると、ユーザーが存在するため、もう一度やり直してください。
getent
falseを返すと(つまり、$name
存在しない)名前が長すぎるかどうかを確認します。その場合は、エラーメッセージを印刷します。そうでない場合は、実行してくださいadduser
。
ところで、getentで見られると予想される実際の終了コードは、0
ユーザーがすでに存在する場合と2
ユーザーが存在しない場合です。場合によっては、getentは別の終了コードを返すことがあります(参考文献を参照)、これはman getent
getentの使用方法(データベース検索やユーザー名の提供など)では不可能です。passwd
少し良いバージョンは、ユーザー名に数字のサフィックスを使用することです。たとえば、ゼロで埋められた3桁の幅の数値フォーマット文字列(たとえば、等)printf
と一緒に使用されます。 0で埋めたくない場合は、代わりに0を使用してください。この変数は、処理された各ユーザー名に対して外部whileループでゼロにリセットされます。%03i
001
002
%i
count
#!/bin/bash
NAME_REGEX='^[a-z][-a-z0-9]*$' # default value for adduser.conf
. /etc/adduser.conf # "source" it in case local config is different
myuser='/home/yakyak/Desktop/Exercises/newusers.txt'
grep "$NAME_REGEX" "$myuser" | while read -r user; do
name="$user"
count=0
while getent passwd "$name" > /dev/null; do
let count+=1
name="$(printf "%s%03i" "$user" "$count")"
done
# check if $user is > 32 characters
if [ "${#name}" -gt 32 ] ; then
echo "username '$name' is too long" > /dev/stderr
else
adduser --disabled-login --gecos '' "$name"
fi
done
このバージョンでは、ユーザー名に2つの変数を使用します。つまり、$user
newusers.txt ファイルから読み取った名前と、$name
使用したい現在のユーザー名についてです。 $ nameは最初に$ userからコピーされ、内部whileループは変数を増やして追加して$count
trueを$user
返すことによって$ nameを更新しますgetent
。
結局のところ、上記のどれも特に良いスクリプトではありません。彼らがすることは最小限です。個人的には、私はbashではなくperlで書くことを好みます。シェルでのテキスト処理はPITAです。。