Как заставить локальную переменную передаваться из одного цикла в другой - PullRequest
1 голос
/ 26 марта 2019

Попытка извлечь запись из двух файлов (foofile, barfile) и передать их в третий файл (dothis.sh) в качестве аргументов. Это работает для бара, но не для foo, так как это выглядит проблемой, связанной с областью действия. Я тоже безуспешно пытался вложить цикл foo в цикл bar:

    #!/bin/bash
    while read foo
                do
                        #echo $foo
                        export foo
    done < FooFile

    while read bar
        do
                #echo $bar
                export bar
    ./dothis.sh $bar $foo
    done < BarFile

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Вот способ зацикливания с двумя входами одновременно в bash:

#!/bin/bash

while read -u 100 foo && read -u 101 bar; do
    ./dothis.sh "$foo" "$bar"
done 100<FooFile 101<BarFile

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

1 голос
/ 26 марта 2019

foo находится в области вашей программы, но оно пустое.
Рассмотрим этот код:

foo="test"
while read foo; do echo $foo; done < /dev/null
echo "foo=$foo"

Результат:

foo=

Проблема в том, что fooбудет установлен пустым, когда чтение не имеет ввода.Это то, что происходит в вашей программе.

Тем не менее, обратите внимание на комментарий oguzismail.(S) он ведет вас в правильном направлении:

paste FooFile BarFile | xargs -n 2 ./dothis.sh

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

...