Оболочка читает файл построчно, но после каждой строки пишет, что не найдено. Что мне не хватает? - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь создать сценарий оболочки для создания пользователей и создания / добавления каждого в группу из списка в текстовом файле в Ubuntu 18.04. У меня были проблемы с чтением входного файла.

Извините, я новичок в написании сценариев, но у меня есть опыт работы на других языках.

Я пробовал переключаться между while и forциклы (не имеет значения), и я исправил путь, чтобы он мог читать файл, но после каждой строки он говорит: «Боб: не найден». Сейчас я просто повторяю его, пока пытаюсь это исправить.

Вот мой сценарий оболочки на данный момент: GNU nano 2.5.3 Файл: shell_lab

#!/bin/sh
# test
cd "$(dirname "$0")"

echo "script running"

for line in $(./input.txt)
do
        echo "$line"
done

И вот мой вкладфайл (в том же каталоге):

GNU nano 2.5.3 Файл: input.txt

bob
larry
joe

Я ожидал, что мне вернутся: bob larry joe

И вот что я получил вместо этого: konather @ ubuntu: ~ $ sudo ./shell_lab

script running
./input.txt: 1: ./input.txt: bob: not found
./input.txt: 2: ./input.txt: larry: not found
./input.txt: 3: ./input.txt: joe: not found`

Я также попробовал этот, который нашел с тем же результатом:

#!/bin/sh

for i in `./input.txt`
do
echo $i
# echo $i"123" | passwd "$i" --stdin
# echo; echo "User $username's password changed!"
done

выше было решено, еще один вопрос ниже

У меня есть еще одна проблема, немного не связанная. Я сейчас пытаюсь автоматизировать создание пароля. я дошел до того, что повторил пароль из файла input.txt в трубе, но не думаю, что он на самом деле отвечает на запросы для меня.

while read u1 p1 do echo "$p1" |echo "$p1"| passwd $u1 # echo "$u1 had the password changed to $p1" done < input.txt Результат: script running Enter new UNIX password: Retype new UNIX password: passwd: Authentication token manipulation error passwd: password unchanged

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

$(./input.txt) является подстановкой команды , пытающейся вызвать команду ./input.txt. Из вашего описания input.txt это не исполняемый файл, который создает список, а текстовый файл, содержащий:

$ cat input.txt
bob
larry
joe

Если вы хотите перебрать строки в файле, вам нужно перенаправить файл в качестве ввода. Вы можете сделать это, просто включив оператор перенаправления в подстановку команд, например, $(< ./input.txt), но, как уже упоминалось в комментарии, вам лучше перенаправить файл в цикл while, например,

#!/bin/sh
# test
cd "$(dirname "$0")"

echo "script running"

while read line
do
    echo "$line"
done < input.txt
* 1015. * Пример использования / Вывод
$ sh test.sh
script running
bob
larry
joe

Необходимо защищать файл без конца файла POSIX (например, без '\n' после последней строки), проверяя,line инициализируется read, например,

while read line || [ -n "$line" ]
do
    echo "$line"
done < input.txt

Это позволит вам читать и выводить последнюю строку независимо от того, есть ли правильная строка, заканчивающаяся после последней строки текста во входном файле. .

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

0 голосов
/ 17 октября 2019

Дэвид ответил на мой первый вопрос (СПАСИБО!)

Мой второй вопрос был о том, как ввести пароль из текстового файла, чтобы ответить на запросы при смене пароля пользователя. Тем не менее, это было невозможно без использования ожидаемого, поэтому я действительно не хотел этого делать. Я разговаривал с одноклассником, и он использовал что-то гораздо более простое и очевидное, что я пропустил. Я использовал useradd со следующими параметрами: useradd -m $u1 -p $p1 $ u1 - имя пользователя, а $ p1 - пароль из файла input.txt.

Я еще не закончил домашнюю работу, но спасибо. надеюсь, что это может помочь кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...