Вложено для цикла в сценарии оболочки Unix - PullRequest
0 голосов
/ 12 марта 2019

Я создаю сценарий оболочки, который примет два условия: сначала он получит все имена файлов и вставит их по одному в поле html, а другой цикл for получит счетчик и будет использован для автоматического увеличения серийного номера.

Я написал такой код

cnt=`find /optware/oracle/logs/20190311_JAVA/TEMP/  -type f | wc -l`
    for ((i in `ls -l /optware/oracle/logs/20190311_JAVA/TEMP/|grep -v ^$|awk '{print $9}` && a=1; a <= $cnt ; a++)) 
    do
    echo "  <tr> $a <td></td><td>$i</td></tr>" >>Temp.lst
    done

Я получаю ошибку как && a = 1: ошибка арифметического синтаксиса

Пожалуйста, помогите мне с этой проблемой.

Ответы [ 3 ]

0 голосов
/ 12 марта 2019

Вы не можете зацикливаться на паре индекс + значение непосредственно в Bash. Я написал бы этот код следующим образом:

index=0
for path in /optware/oracle/logs/20190311_JAVA/TEMP/*
do
    echo "  <tr>${index}<td></td><td>${path}</td></tr>" >> Temp.lst
    ((++index))
done
0 голосов
/ 12 марта 2019

Вы смешиваете две циклические конструкции . Вы можете использовать любой из них, но не оба вместе.

for name [ [in [words …] ] ; ] do commands; done

и

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
0 голосов
/ 12 марта 2019

((...)) должно содержать три арифметических выражения.in не является арифметическим оператором.На самом деле, неясно, чего вы пытаетесь достичь.

Чтобы вложить два цикла, укажите каждый со своим for:

for i in `ls -l /optware/oracle/logs/20190311_JAVA/TEMP/|grep -v ^$|awk '{print $9}` ; do
    for (( a = 1 ; a <= cnt ; a++ )) ; do
        echo "$i:$a"
    done
done

Если вам просто нужен счетчик,нет необходимости во втором цикле:

a=1;
for i in `ls -l /optware/oracle/logs/20190311_JAVA/TEMP/|grep -v ^$|awk '{print $9}` ; do
    echo "$i:$a"
    (( ++a ))
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...