在Unix Shell脚本中嵌套for循环

时间:2019-03-11 22:11:16

标签: linux shell loops unix

我正在创建将首先满足两个条件的shell脚本,它将获取所有文件名,并在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 :(得分:0)

((...))应该包含三个算术表达式。 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

答案 1 :(得分:0)

您无法在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

答案 2 :(得分:0)

您正在混淆两个looping constructs。您可以使用任何一个,但不能同时使用。

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

for (( expr1 ; expr2 ; expr3 )) ; do commands ; done