私は自分の台本を作るために多くの努力をした学生です。一般的に言えば、提供された情報と規則によれば、爆発的なスクリプトキディーイングを実行し、他の人が実行するアクションに追加できます(例えば、自分が恥ずかしいことを知っています)。しかし、bash / pythonを使用しようとしたとき、私は何年もの間私の命を救うために最初から何かを作成するために必要な脳能力がないことが明らかになりました。だから私はここにいます。 4年前に同様のトピックに関する投稿があり、それが私が達成したいことへの正しい道をたどっているようです。しかし、私の人生では、私がどこに間違っているのかわからないようです。以下はjesse_bに感謝したいスクリプトです。使用する必要があるパラメータに触れましたが、残念ながらスクリプトを実行すると、スクリプトにあると思われる項目のマニュアルページが表示されます(たぶんuseradd?)。誰もが私を保護し、建設的なフィードバックを提供できる場合は非常に感謝します。
#! /usr/bin/bash
MY_INPUT='Newbies.csv'
declare -a A_SURNAME
declare -a A_FIRST
declare -a A_USERNAME
declare -a A_GROUP
declare -a A_SECGROUP
declare -a A_COMMENTS
while IFS=, read -r COL1 COL2 COL3 COL4 COL5 COL6 TRASH; do
A_SURNAME+=("$COL1")
A_FIRST+=("$COL2")
A_USERNAME+=("$COL3")
A_GROUP+=("$COL4")
A_SECGROUP+=("$COL5")
A_COMMENTS+=("$COL6")
done <"$MY_INPUT"
for index in "${!A_USERNAME[@]}"; do
useradd -g "${A_GROUP[$index]}" -G "${A_SECGROUP[$index]}" -c "${A_COMMENTS[$index]}"
done
パラメータ例:姓、名前、ユーザー名、グループ、secgroup、説明:
Esche,Adlai,aesche,Accounting,Emp,5326,
West,Kaila,kwest,Accounting,Emp,0699,
July,Markos,mjuly,MArketing,Emp,7208,
注投稿リンク:.csvファイルからユーザーを作成する
答え1
useradd行の末尾にユーザー名を追加するのを忘れただけでなく、状況を必要以上に複雑にしました。
複数の配列変数は必要ありません(CSVデータでより多くの操作を実行したい場合を除く)。後ろにfor
アカウントはすでに作成されています。それでも、既存のループ内でこれを行うことをお勧めします。またbash
、実際にはテキスト処理に巧みな言語(例:awk
または)の代わりに(テキスト処理に不都合な言語)を使用していますperl
。
perl
1行で目的を達成する方法は次のとおりです。
$ perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
system("echo","useradd","-g",$group,"-G",$secgroup,"-c",$comments,$username)' Newbies.csv
出力例:
useradd -g Accounting -G Emp -c 5326 aesche
useradd -g Accounting -G Emp -c 0699 kwest
useradd -g MArketing -G Emp -c 7208 mjuly
これはテスト実行で書かれており、内容だけを印刷します。会議実際には、ユーザーアカウントを追加せずにこれを行います。コマンドが正しく生成されたことを確認したら、"echo"
コマンドから削除します。system()
useradd
Bashとは異なり、Perl関数を使用するときに変数を参照する必要はありません。system()
与えられたリストの各要素は、システムが実行されているプログラムに別々の別の引数として渡されます(この場合、プログラムは、またはecho
)をuseradd
削除した後のリスト"echo"
(スペース文字が含まれていても)。ワイルドカードやその他のシェルメタ文字を渡さないと、シェルは使用されず、system()
シェルのトークン化または拡張の影響を受けません。 Perlには、globを拡張したりファイル名でいっぱいになった配列を構築するための独自の組み込みメソッドがあるので、ワイルドカードの転送を避けるのは簡単です。
変数を引用する必要がある唯一のケースは、変数を文字列に結合することです。たとえば、次のコマンドを使用して、GECOSフィールドに名前と姓を追加できます。
$ perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
system("echo","useradd","-g",$group,"-G",$secgroup,"-c","$first $surname - $comments",$username)' Newbies.csv
それにもかかわらず、これを行う他の多くの方法があります。たとえば、.
接続演算子を使用する場合です。
$first . " " . $surname . " - " . $comments
または以下を使用してくださいjoin()
。
join(" ",$first,$surname,"-",$comments)
出力例:
useradd -g Accounting -G Emp -c Adlai Esche - 5326 aesche
useradd -g Accounting -G Emp -c Kaila West - 0699 kwest
useradd -g MArketing -G Emp -c Markos July - 7208 mjuly
ここに示されている出力では明確ではありませんが、コメントは実際には次のように書かれています。一つuseradd
オプションパラメータ-c
。たとえばAdlai Esche - 5326
、オプションの単一パラメータ-c
、いいえ4つの別々の引数、まさに空白文字を含む文字列です。
"echo",
各パラメータが別々の行に印刷されるように変更すると、"printf","%s\n",
これを確認できます。
$ perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
system("printf","%s\n","useradd","-g",$group,"-G",$secgroup,"-c","$first $surname - $comments",$username)' Newbies.csv
useradd
-g
Accounting
-G
Emp
-c
Adlai Esche 5326
aesche
...
バージョンはawk
非常に似ています。主な違いは、入力をawk
フィールド区切り文字(FS
変数、デフォルトは空白ですがコンマで設定できます-F,
)に基づいて入力を列($ 1、$ 2、$ 3 ....)に自動的に分割することです。一方、awkのシステム機能には以下が必要です。文字列引数なので、shまたはbashの要件と同様に直接引用する必要があります。
Perlには入力を自動的に列に分割する同様のオプションがありますが(名前付き配列に分割)、-F
意味のある変数名(代わりに)を使用して@F
コードを読み取るのが簡単です。$group
$F[2]
バッシュバージョン:
#!/bin/bash
MY_INPUT='Newbies.csv'
while IFS=, read -r surname first username group secgroup comments; do
echo useradd -g "$group" -G "$secgroup" -c "$comments" "$username"
#echo useradd -g "$group" -G "$secgroup" -c "$first $surname - $comments" "$username"
#printf "%s\n" useradd -g "$group" -G "$secgroup" -c "$first $surname - $comments" "$username"
done < "$MY_INPUT"
繰り返しますが、これは練習で書かれています。echo
実際にユーザーアカウントを作成するには削除してください。 GECOS フィールドに名前と姓を追加する方法を示す注意事項も含まれています。
出力はPerlバージョンと同じです。
useradd -g Accounting -G Emp -c Adlai Esche - 5326 aesche
useradd -g Accounting -G Emp -c Kaila West - 0699 kwest
useradd -g MArketing -G Emp -c Markos July - 7208 mjuly
または:
useradd -g Accounting -G Emp -c Adlai Esche - 5326 aesche
useradd -g Accounting -G Emp -c Kaila West - 0699 kwest
useradd -g MArketing -G Emp -c Markos July - 7208 mjuly
BashとPerlの組み合わせ:
#!/bin/bash
MY_INPUT='Newbies.csv'
perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
system("echo","useradd","-g",$group,"-G",$secgroup,"-c",$comments,$username)' "$MY_INPUT"
これは、テキスト処理にawkやPerl、またはほとんどすべて(bashを除く)を使用する方が良い理由の良い例を実際に提供しない非常に簡単な作業です。バラよりシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?
しかし、ここでもPerlのバージョンが高速です(作成するアカウントが何千ものものでなければそれほど重要ではありません)。そしてsplit /\s*,\s*/
カンマで区切られたフィールドからすべての前後のスペースを削除します。 Perl ではマイナーな操作で、bash ではより多くのタスクを実行します。つまり、入力データを「整理」して、使用する目的に合わせて適切にサービスできるようにします。 Unixのユーザー名とグループ名はスペースで始めることはできません。