Как читать от пользователя в строке чтения цикла while? - PullRequest
5 голосов
/ 13 марта 2012

У меня был файл bash, который запрашивал у пользователя некоторые параметры и использовал значения по умолчанию, если ничего не было дано. Затем скрипт продолжил выполнять некоторые другие команды с параметрами. Это работало отлично - никаких проблем до самого последнего дополнения.

Пытаясь прочитать параметр NAMES из txt-файла, я добавил цикл while для получения имен в файле, но мне все равно хотелось бы, чтобы оставшиеся параметры запрашивались.

Но как только я добавил цикл while, вывод показывает напечатанное приглашение get_ans () и никогда не делает пауз для чтения, поэтому выбираются все значения по умолчанию.

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

Что я сломал, добавив цикл while?

cat list.txt | 
while read line
do 
  get_ans "Name" "$line"
  read NAME < $tmp_file

  get_ans "Name" "$line"
  read NAME < $tmp_file
done

function get_ans
{
  if [ -f $tmp_file ]; then
    rm $tmp_file

  PROMPT=$1
  DEFAULT=$2

  echo -n "$PROMPT [$DEFAULT]: "
  read ans
  if [ -z "$ans" ]; then
    ans="$DEFAULT"
  fi
  echo "$ans" > $tmp_file
}

(ПРИМЕЧАНИЕ. Код не копируется и не вставляется, поэтому, пожалуйста, извините за опечатки. Фактический код имеет функцию, определенную перед main ())

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Вы передаете данные в свои циклы while STDIN.Таким образом, read в get_ans также получает данные из этого потока STDIN.

Вы можете передавать данные в другой дескриптор файла, чтобы избежать проблемы и перестать беспокоиться о временных файлах:

while read -u 9 line; do
   NAME=$(get_ans Name "$line")
done 9< list.txt

get_ans() {
    local PROMPT=$1 DEFAULT=$2 ans
    read -p "$PROMPT [$DEFAULT]: " ans
    echo "${ans:-$DEFAULT}"
}
3 голосов
/ 15 марта 2012

Для чтения непосредственно из терминала, а не из stdin (при условии, что вы работаете на машине * NIX, а не Windows):

while read foo</some/file; do
    read bar</dev/tty
    echo "got <$bar>"
done
1 голос
/ 13 марта 2012

Когда вы передаете одну команду в другую в командной строке, например:

$ foo | bar

Оболочка собирается настроить ее так, чтобы стандартный ввод bar исходил из fooстандартный вывод.Все, что foo отправляет на стандартный вывод, будет напрямую направлено на стандартный ввод bar.

В вашем случае это означает, что единственное, что может прочитать ваш скрипт, - это стандартный вывод catкоманда, которая будет содержать содержимое вашего файла.

Вместо использования канала в командной строке, сделайте имя файла первым параметром вашего скрипта.Затем откройте и прочитайте файл из своего кода и прочитайте его как обычно.

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