【问题标题】:Looping through lines in csv file with bash使用bash循环遍历csv文件中的行
【发布时间】:2013-04-08 05:35:28
【问题描述】:

即使 .csv 文件中有 2 个条目(行),为什么这个 while 循环只执行一次?
当没有文件/目录与表达式匹配时,字符串 'ls: /root/heapdump: No such file or directory' 怎么也输出到控制台?

#!/bin/bash

INPUT=targets.csv

[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while IFS=, read target user password path
do
    result=$(sshpass -p "$password" ssh "$user"@"$target" ls "$path"*heapdump*)

    if [ $? -ne 0 ]
    then
            echo "No Heap dumps detected."
    else
            echo "Found a Heap dump! Possible OOM issue detected"
    fi

done < $INPUT

.csv 内容..

rob@laptop:~/scripts$ cat targets.csv 
server.com,root,passw0rd,/root/
server.com,root,passw0rd,/root/

输出..

rob@laptop:~/scripts$ ./checkForHeapdump.sh 
ls: /root/*heapdump*: No such file or directory
No Heap dumps detected.

【问题讨论】:

    标签: bash csv while-loop


    【解决方案1】:

    ssh 正在从标准输入读取数据,因此在第一次迭代期间它会占用 CSV 文件的其余部分。改为:

    result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump*)
    

    -n 选项将ssh 标准输入重定向到/dev/null

    关于错误信息,这是正常的错误输出:

    ls filename-or-wildcard
    

    并且没有匹配项。如果您不想看到,请重定向 stderr:

    result=$(sshpass -p "$password" ssh -n "$user"@"$target" ls "$path"*heapdump* 2>/dev/null)
    

    【讨论】:

      【解决方案2】:

      我猜你的 CSV 文件的最后一行没有以回车符结束。

      当这种情况发生时,read 将填充变量,但如果没有回车来终止该行,它将改为到达文件末尾,因此循环不会执行。

      如果您无法确认最后一行将以回车结束,并且无法通过将echo &gt;&gt; targets.csv放在脚本开头添加一个来编辑文件,那么您可以检查循环后的变量以对他们采取行动。为此,我将在循环结束时清除其中一个变量,这样您就可以简单地测试它是否是非零长度以知道最后有一个未处理的行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 2012-07-25
        相关资源
        最近更新 更多