For 循环运行两次,

For 循环运行两次,

所以我对 bash 脚本相当陌生,但我想要一份 bash 工作,它将:

创建一个后期时间戳。 (作为 var 或文件)

从名为 feeds.txt 的文件中读取行。

将数字字符串从整个字符串中分离到两个变量 $feedNum 和 $wholeString 中。

然后执行 cat 命令来创建或附加一个名为 $wholeString 的新文件,并将 timestamp.txt 的内容附加到该文件中。

最后,执行wget命令将$feedNum插入到url字符串中,并将wget的响应输出到之前创建的$wholeString文件中。

这就是我所拥有的。

feeds.txt 看起来像(它最终会更长):

8147_feed_name.xml
19176_nextfeed_name.xml

我拼凑出来的脚本看起来像这样。

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
for feedNum in `cat feeds.txt |cut -d _ -f 1`;do
   for  wholeString in `cat feeds.txt`; do
    cat /home/scripts/timestamp.txt >>/home/scripts/tmp/$wholeString ;
    wget https\://some.url.com/reports/uptimes/${feedNum}.xml?\&api_key=KEYKEYKEYKEY\&location=all\&start_date=recent_hour -O ->>/home/scripts/tmp/$wholeString;
done
done

我的问题是,它运行了 4 次,所以如果我放弃 cat 和 wget 并用简单的 echo 替换它们,就像这样,

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
for feedNum in `cat feeds.txt |cut -d _ -f 1`;do
   for  wholeString in `cat feeds.txt`; do
    echo $feedNum $wholeString
done
done

我得到这样的输出,其中顶线和底线是正确的。中间的两个是混合的。

8147 8147_feed_name.xml
8147 19176_nextfeed_name.xml
19176 8147_feed_name.xml
19176 19176_nextfeed_name.xml

我明白它为什么这样做,但不知道如何解决它。

答案1

这应该可以解决分割字符串的问题(尽管一如既往,请注意文件名中的空格):

#Changes the directory to the correct location
cd /home/scripts
# Inserts the proper timestamp in the file , postdating for one hour.
date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/timestamp.txt

#Loop Logic
while IFS=_ read feedNum xmlFile; do
  echo "$feedNum $xmlFile"
done < feeds.txt

wget从这里组装您的呼叫应该很简单。

答案2

OP 此处为不同的用户名。我最终使用了您发布的第一个代码 DopeGhoti。经过一些细微的修改。感谢您向我展示如何抓取一行,然后从中执行,而不是尝试重新读取源文件并为每个文件拉取。

 #Create Timestamp
    date -d '1 hour ago' "+%m/%d/%Y %H:%M:%S" >/home/scripts/sitename/timestamp.txt

    #Loop Logic
    while read line; do
       feedNum="$(echo "$line" | cut -d_ -f1)"
       wholeString="$(echo "$line")"
       cat /home/scripts/sitename/timestamp.txt >>/home/scripts/sitename/$wholeString
       wget https\://my.sitename.com/reports/uptimes/${feedNum}.xml?\&api_key=KEY\&location=all\&start_date=recent_hour -O ->>/home/scripts/sitename/$wholeS$
    done < feeds.txt

这为我们所有 18 个提要提供了正确的输出。

谢谢你!

相关内容