将文件中的行读取到变量中

将文件中的行读取到变量中

我正在尝试自动化一个大型流程以节省时间和精力,但我可能会使其变得比需要的更加困难。到目前为止我正在做的是:

#!/bin/bash
LISTFILE="/tmp/filename"
for FILE in $LISTFILE
    do curl -XDELETE ADDRESS:PORT/VALUE/VALUE/$FILE
done

但它没有返回 $FILE 的值,而是在 /tmp 和 /filename 上出错。我需要它做的是迭代文件并为每一行运行一次命令并填写 $FILE 值。

任何提示将不胜感激。

答案1

在这种情况下for,您只需进行一次迭代,其中 的值$FILE就是 的值$LISTFILE

如果您想遍历文件中的行,可以使用 read:

while read -r FILE; do
    curl -XDELETE "ADDRESS:PORT/VALUE/VALUE/$FILE"
done < /tmp/filename

这假设该文件的每一行都列出了一个单独的文件。

答案2

for行:

for FILE in $LISTFILE

并不意味着“对于其中的每一行$LISTFILE”。它的意思是“对于变量中的每一项” $LISTFILE。您$LISTFILE只包含文件路径,因此这就是所$FILE保存的内容。

让你的for命令遍历“每一行”的内容$LISTFILE',您必须将代码更改为如下所示:

#!/bin/bash
LISTFILE="/tmp/filename"
while read FILE
   do echo $FILE
done < $LISTFILE

这使用while循环并使用命令read,该命令逐行读取“输入”。我们的输入是文件的内容,我们在最后指定(这部分:)< $LISTFILE

答案3

几乎在所有使用 shellfor循环处理文本文件中的行的情况下,最好使用awkorcutsedor perl(或任何其他可用的文本处理工具)。它会更快、更容易,并且不会产生不必要的副作用(例如在使用之前设置 IFS read)。

例如:

awk '{print "curl -XDELETE '\''ADDRESS:PORT/VALUE/VALUE/"$1"'\''"}' \
 /tmp/filename | 
 sh

(先运行它,而不通过管道连接到 sh 或 bash 或 dash 等,以验证它是否产生正确的输出)

这会执行您想要的操作,并在 URL 周围加上单引号,以适应其中包含空格、全局通配符、与号、分号等的文件名。适用于除文件名中带有单引号或换行符的文件之外的所有文件。后者无法通过换行符分隔的输入文件来修复,但前者可以通过在语句之前插入以下内容来修复print

gsub(/'\''/,"'"'\\\\''"'");

我最近在这里写了一篇关于它的作用的解释:https://unix.stackexchange.com/a/293818/7696

awk '{ gsub(/'\''/,"'"'\\\\''"'");
       print "curl -XDELETE '\''ADDRESS:PORT/VALUE/VALUE/"$1"'\''"}' \
 /tmp/filename | 
 sh

如果您绝对确定文件名中不会有烦人的字符,那就更简单了:

awk '{ print "curl -XDELETE ADDRESS:PORT/VALUE/VALUE/"$1 }' /tmp/filename | sh

相关内容