Чтение строк из каждого файла в массиве - условие никогда не выполняется - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь интегрировать команду cat в цикл for, где cat читает элемент '$ currentccoutput', но кажется (я думаю), что cat читает строку буквально, а не понимает, что это элемент массива симя txt-файла.

#create an array of text files

currentccoutputs=($currentccfolder'/'*.txt*)

#basic for loop until I can get my cat command working

for currentccoutput in "${currentccoutputs[@]}"; do

    cat "$currentccoutput" | while read LINE; do

        # I have .txt files with three numbers per line
        # that I would like to read / use

        IFS=' ' read C1 C2 threshold
            if [ $C1 != $C2 ] && [ $threshold \> 0.2 ]; then
            echo "Huzzah!!!! Progress at last"
        fi

     done < "$currrentccoutput" # I don't know what 
                                # this backwards chevron
                                # does but other people
                                # have used it...
done

Я не сомневаюсь, что в этом фрагменте есть и другие недостатки, но я совершенно новичок в создании сценариев, поэтому я стараюсь держать вещи в пределах того, что язнаю пока, и, надеюсь, сложные решения придут позже. (сейчас я пытаюсь добраться от острова А до острова Б, где несколько кусков дерева и немного пеньковой веревки будут понятны и воспроизводимы. Хотя я ценю советы и надеюсь однажды построить -приличный фрегат, прямо сейчас это может меня несколько запутать).

Я никогда даже не использовал «пока», «прочитал» или «LINE», я ущипнул его от чужого решения.

Я использовал команду echo, чтобы убедиться, что не мои пути неверны, просто я неправильно использую cat.

1 Ответ

3 голосов
/ 07 марта 2019

Единственная проблема с тем, как вы используете cat, заключается в том, что вы переопределяете его с помощью (намного лучшего) встроенного в оболочку перенаправления.Это хорошо - на самом деле, это предпочтительнее ;вам не следует использовать cat, если вы абсолютно не обязаны. [1]

Что такое проблема в том, что вы используете read LINE, а затем read C1 C2 threshold друг за другом, оба исходят из одного и того же источника.

Это означает, что вы читаете первую строку каждого файла в переменную LINE (которую ваш код никогда не просматривает снова) и вторая строка в переменные C1, C2 и threshold.Если есть еще строки, вы читаете третью в LINE, четвертую в C1 / C2 / threshold и т. Д.

Если вы не хотите чтобы пропустить все остальные строки (начиная с первой), просто полностью уберите read LINE, сделав ваш код примерно таким:

#!/usr/bin/env bash
case $BASH_VERSION in '') echo "ERROR: This script must be run with bash" >&2; exit 1;; esac

currentccoutputs=( "$currentccfolder"/*.txt )

for currentccoutput in "${currentccoutputs[@]}"; do
    while IFS=$' \t\r' read -r c1 c2 threshold; do
        if [ "$c1" != "$c2" ] && [ "$(bc -l <<<"$threshold > 0.2")" = 1 ]; then
            echo "Huzzah!!!! Progress at last: c1=$c1; c2=$c2; threshold=$threshold"
        fi
     done < "$currentccoutput"
done

См .:


[1] - Да, это означает, что выследует игнорировать многие, если не большинство примеров кода bash, который вы найдете в Интернете. Закон осетровых применяется.

...