Вложенные циклы, кажется, пропускают второй цикл в Bash - PullRequest
1 голос
/ 14 февраля 2011

Я пытаюсь написать скрипт, который:

a) читает содержимое файла .csv

b) устанавливает переменную в значение в первой позиции (то есть вслева от запятой)

c) сравнить значение переменной с каждой позицией в массиве.Если значение находится в массиве, выполните одну команду, в противном случае вставьте это значение в первый доступный слот в массиве.

.csv-файл имеет формат:

co: 7077, he17208am3200816internet.pdf, he17208am3200917internet.pdf co: 7077, he17208am3200817internet.pdf, he17208am3200918internet.pdf co: 7077, he17208am3200818internet.png, hef.pdf, tra210051internet.pdf, tra21005101internet.pdf co: 7162, tra210051appinternet.pdf, tra21005102internet.pdf co: 7178, tra4157l11201021internet.pdf, tra4158l11201021internet.pdf * * * 101 * 101 * 1012, 1010121010, 1010121011, 1010121011, 11011, 11011, 11010, 11011, 11011, 11011, 11011, 11011, 11010, 11014, 11011, 11011, 11014, 11011, 11014, 11014, только для того, что вы можете сделать это с помощью Интернета.Пока мой скрипт выглядит так:

#!/bin/bash

declare -a array
anum=0
src=source.csv
pid=0

while read line;
do
pid=$( echo $line | awk '{print$1}' FS=",")

  for n in "${array[@]}";
     do

        if [[ "$pid" = "$n" ]] ;
         then

          echo Duplicate value: "$pid";

         else
          array[$anum]="$pid"
          anum=$(( $anum +1 ))
        fi
     done
done < $src

echo ${array[@]}

Когда скрипт выполняется, pid успешно устанавливается и сбрасывается при каждой итерации цикла while, но, очевидно, вложенный цикл for никогда не запускается.

Из моего Google'а я подозреваю, что это имеет отношение к трубе в pidлинии, но я буду ошибаться, если смогу выяснить, как заставить это работать.

Любая помощь очень ценится.

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

Вы не заполняете свой массив. Цикл for никогда не выполняется, потому что массив пуст.

0 голосов
/ 14 февраля 2011

Установите флаг в предложении else вместо добавления туда элемента массива. После вашего for цикла, если флаг установлен, добавьте элемент массива. Не забудьте снять флажок.

Вы можете сделать array[anum++] без следующей строки или (( anum++ )) вместо anum=$(($anum + 1)).

Также: while IFS=, read -r pid discard, если вам не нужна остальная часть строки (вы можете сделать это немного иначе, если вам это нужно) Для этого вам не понадобятся echo и awk.

0 голосов
/ 14 февраля 2011

почему вы использовали двойные квадратные скобки? а также вы использовали одинарные, а не двойные в if?

попробуйте эти однострочники ...

$ if [ "a" == "b" ] ; then echo hello ; fi

$ if [ "a" == "a" ] ; then echo hello ; fi
...