我正在尝试自动化一个大型流程以节省时间和精力,但我可能会使其变得比需要的更加困难。到目前为止我正在做的是:
#!/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
循环处理文本文件中的行的情况下,最好使用awk
orcut
或sed
or 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