#bash #shell #file #multiple-users
Вопрос:
Я хочу добавить несколько пользователей в систему Red Hat UNIX. Я использую два текстовых файла в качестве источников, содержащих 9 имен пользователей и 9 полных имен, разделенных по отдельности на 9 новых строках.
$U содержит usernames.txt, $I содержит полные имена для команды-c, а $Z содержит конечные числа от 1 до 9 для установки конечного значения-u. Я надеялся, что сценарий достигнет того, что он заполнит команду useradd значениями, которые я описал, чтобы команда useradd выполняла добавление пользователей с их именем пользователя, полем комментария (полное имя) и значением идентификатора. Я использовал команду echo, чтобы проверить, каковы были выходные данные, прежде чем фактически выполнить часть команды useradd сценария в системе. Однако сценарий фактически интерпретировал пробелы в fullnamecomment.txt в виде отдельных итераций и в основном скрипт выводит один и тот же запрос 9 раз, последовательно добавляя 1 к значению-u.
@Сообщество, может ли кто-нибудь внести какой-либо вклад в оптимизацию этого сценария или изменение моего метода для добавления нескольких пользователей, заполняющих имя пользователя, комментарий и значения идентификаторов в команде useradd?
Спасибо.
#!/bin/bash
for U in $(cat username.txt)
do
for I in $(cat fullnamecomment.txt)
do
for Z in {1..9}
do
#useradd $U -m -c $I -u 10010$Z
echo "useradd $U -m -c $I -u 10010$Z"
done
done
done
Комментарии:
2. Кроме того, если вы хотите , чтобы первая строка из
username.txt
совпадала с первой строкойfullnamecomment.txt
, 2-я строка каждого файла совпадала со 2-й строкой другого и т. Д., Вам вообще не следует использовать вложенный цикл. Если это то , что вы пытаетесь сделать, четко укажите это, и я смогу найти существующий вопрос с вопросом и ответом, описывающий технику.3. Кстати, чтобы показать свою собственную модификацию чьего-либо ответа, добавьте свой собственный ответ с помощью кнопки Добавить ответ вместо редактирования ответов в вопрос. См. Обсуждение обмена метастеками, в том числе Что делать, когда ОП отвечает на свой собственный вопрос в правке? и должен ли я обновить свой вопрос, чтобы включить правильный ответ?
4. Спасибо, Чарльз! Я обновил свой вопрос и добавил ответ с изменениями в разрешение SteveKlines, чтобы он работал в моей системе. Спасибо Чарльздаффи и Стивеклайну за то, что нашли время ответить. Очень признателен! Я надеюсь однажды ответить на один из ваших вопросов и отплатить вам тем же! Заботиться.
Ответ №1:
Когда вы размещаете свои циклы, это означает, что вы хотите запускать внутренний цикл снова и снова, каждый раз, когда происходит внешний цикл. Это явно не то, что вы на самом деле собираетесь здесь делать; вместо этого ваш код предназначен для пошагового перебора переменных, сопоставляя каждое имя пользователя, полное имя и UID. Это означает, что у вас должен быть только один цикл вместо того, чтобы вкладывать несколько циклов друг в друга.
offset=0
while IFS= read -r username <amp;3 amp;amp; IFS= read -r fullname <amp;4 amp;amp; (( offset )); do
useradd "$username" -m -c "$fullname" -u "$((100100 offset))"
done 3<username.txt 4<fullnamecomment.txt
Комментарии:
1. Большое вам спасибо, что нашли время ответить. Ваш ответ отлично сработал без каких-либо изменений и пометил это как ответ.
Ответ №2:
Разрешение от SteveKline изменено:
#!/bin/bash
Z=100101
IMPORTCSV=$(cat tabdelimituserlist.csv)
while read -r line; do
U=$(echo $line | cut -f1 -d:)
I=$(echo $line | cut -f2 -d:)
echo "useradd "$U" -m -c "$I" -u "$Z""
#useradd "$U" -m -c "$I" -u "$Z"
#Optional since RHEL passwd permits stdin arguments
#echo 73mp@ssw0rd | passwd --stdin "$U"
Z=$(( $Z 1 )) #Will increment 1 after 100100 for each user added
done <<< "$IMPORTCSV"
Комментарии:
1. Не используйте
echo $line | cut ...
для разделения полей,read
можете сделать это самостоятельно, напримерIFS=: read -r U I ignored
. См . BashFAQ #1: Как я могу прочитать файл (поток данных, переменную) построчно (и/или поле за полем)? Кроме того, ваше цитирование довольно запутано; shellcheck.net хорошо указывает на проблемы с цитированием.