所以我对 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 个提要提供了正确的输出。
谢谢你!