当Bash中发生错误时,如何继续下一次迭代

时间:2018-06-22 13:36:51

标签: linux bash shell command

在下面,您可以找到一个必须管理csv文件的bash脚本。

#!/bin/bash
IFS=";"

while read -a line;do
    printf "xxxxxxxxxxx Adresse: " >> retour.txt
    printf ${line[0]} >> retour.txt
    for i in ${line[@]}
    do
        if [ "$i" != "${line[0]}" ]
        then
            printf "\n port: " >> retour.txt
            printf $i >> retour.txt
            printf "\n" >> retour.txt
            nc ${line[0]} $i >> retour.txt 2>&1
        fi
    done
    printf "\n\n" >> retour.txt
done < Classeur.csv

csv文件的每一行包含以下内容:

  • 一个ID
  • 一些必须使用nc软件测试的端口。

当我启动脚本时,它在第一行之后停止。 如果我从代码中删除以下行,则一切都将被处理。

nc ${line[0]} $i >> retour.txt 2>&1

尽管如此,删除的行仍包含主要操作... 因此,我想这是线路中的错误,我想知道出现错误时如何继续操作。

----------- 2018年6月25日------

我遵循人们评论所提供的建议。当我在调试模式下启动代码时,得到以下结果:

 IFS=';'
 read -a line
 printf 'xxxxxxxxxxx Adresse: '
 printf xxx.xxx.xxx.238
 for i in '${line[@]}'
 '[' xxx.xxx.xxx.238 '!=' xx.xx.xx.238 ']'
 for i in '${line[@]}'
 '[' yyy1 '!=' xx.xx.xx.238 ']'
 printf '\n port: '
 printf yyy1
 printf '\n'
 nc -w 2 xxx.xxx.xxx?.238 yyyy
 telnet xxx.xxx.xxx.238 yyy1
 Trying xxx.xxx.xxx.238...
 Connected to xxx.xxx.xxx.238.
 Escape character is '^]'.
 Connection closed by foreign host.
 for i in '${line[@]}'
 '[' yyy5 '!=' xxx.xxx.xxx.238 ']'
 printf '\n port: '
 printf yyy5
 printf '\n'
 nc -w 2 xxx.xxx.xxx.238 yyy5
 telnet xxx.xxx.xxx.238 yyy5
 Trying xxx.xxx.xxx.238...
 telnet: connect to address xxx.xxx.xxx.238: Connection refused
 for i in '${line[@]}'
 '[' yyy6 '!=' xxx.xxx.xxx.238 ']'
 printf '\n port: '
 printf yyy6
 printf '\n'
 nc -w 2 xxx.xxx.xxx.238 yyy6
 telnet xxx.xxx.xxx.238 yyy6
 Trying xxx.xxx.xxx.238...
 telnet: connect to address xxx.xxx.xxx.238: Connection refused
 printf '\n\n'
 read -a line 

我用xxx.xxx.xxx.238替换了ip,并用yyy1这样的值替换了端口

它也停在第一行。

这是csv文件:

xxx.xxx.xxx.238;yyy1;yyy5;yyy6
xxx.xxx.xxx.82;yyy1;yyy5;yyy6
xxx.xxx.xxx.15;yyy6;yyy7;yyy0

就像您看到的那样,仅使用第一行。

如果我删除>> retour.txt并添加,请在创建的文件中获取以下文本:

xxxxxxxxxxx Adresse: xxx.xxx.xxx.238
port: yyy1
Trying xxx.xxx.xxx...
Connected xxx.xxx.xxx.238.
Escape character is '^]'.
port: yyy5
Trying xxx.xxx.xxx.238...

port: yyy6
Trying 1xxx.xxx.xxx.238... 

它与csv文件的第二行无关。

-----以下代码为解决方案-----

Finally, i arrived to solve the problem by following another way:

#!/bin/bash
IFS=";"
nbLines=$(cat classeur.csv | wc -l)
for ((j=1;j<=nbLines;j++))
do
        numRow="NR=="
        position=$numRow$j

        row=$(awk $position classeur.csv)
        IFS=" " read -ra TAB <<< $row
        for cell in "${TAB[@]}"
        do
                ipValeur=${TAB[0]}
                if [ "$cell" != "$ipValeur" ]
                then
                        printf "\n port: " >> retour.txt
                        printf $cell >> retour.txt
                        printf "\n" >> retour.txt
                        nc -w 2 $ipValeur $i >> retour.txt 2>&1
                else
                        printf "xxxxxxxxxxx Adresse: " >> retour.txt
                        printf $ipValeur >> retour.txt
                fi
        done
done

0 个答案:

没有答案