无法在 bash 循环脚本中使用 var 名称访问文件
Cannot touch files with var name in bash script for loop
我正在为 PiHole 编辑一个脚本,将 adblock 列表格式转换为 dns 格式,以供 PiHole 使用。
这个想法是滚动一个 lists.list 文件,其中包含指向不同列表的链接,对该文件的每个链接进行卷曲,并为每个名为 $link.list 的链接创建一个包含所有 dns 名称的文件。
*问题是:*
我收到消息 "touch: cannot touch 'https://easylist-downloads.adblockplus.org/easylistgermany.txt.list': No such file or directory"
我想看看是不是版权问题,所以我把它放到了我的 home/user 文件夹中。
如果我这样做
curl --silent $source >> ads.txt
或
touch ads.txt
有效
这是我写的:
for sources in `cat lists.list`; do
echo $source
touch "$source".list
echo `curl --silent $source` > $source.list
echo -e "\t`wc -l $source.list | cut -d " " -f 1` lines downloaded"
done
然后我得到
https://easylist-downloads.adblockplus.org/easylist.txt
touch: cannot touch 'https://easylist-downloads.adblockplus.org/easylist.txt.list': No such file or directory
有什么建议吗?
感谢您的宝贵时间!
这是因为您使用完整的 URL 作为文件名,但文件名中不能有斜线。您能否将文件命名为 URL 中的最后一位?那么这应该有效:
#!/bin/bash
for source in `cat lists.list`; do
echo $source
filename=$(sed -E 's@.+/@@' <<< $source).list # <-- remove everything up to and including the last slash
curl --silent "$source" -o "$filename"
echo -e "\t`wc -l $filename | cut -d " " -f 1` lines downloaded"
done
我正在为 PiHole 编辑一个脚本,将 adblock 列表格式转换为 dns 格式,以供 PiHole 使用。 这个想法是滚动一个 lists.list 文件,其中包含指向不同列表的链接,对该文件的每个链接进行卷曲,并为每个名为 $link.list 的链接创建一个包含所有 dns 名称的文件。
*问题是:* 我收到消息 "touch: cannot touch 'https://easylist-downloads.adblockplus.org/easylistgermany.txt.list': No such file or directory"
我想看看是不是版权问题,所以我把它放到了我的 home/user 文件夹中。 如果我这样做
curl --silent $source >> ads.txt
或
touch ads.txt
有效
这是我写的:
for sources in `cat lists.list`; do
echo $source
touch "$source".list
echo `curl --silent $source` > $source.list
echo -e "\t`wc -l $source.list | cut -d " " -f 1` lines downloaded"
done
然后我得到
https://easylist-downloads.adblockplus.org/easylist.txt
touch: cannot touch 'https://easylist-downloads.adblockplus.org/easylist.txt.list': No such file or directory
有什么建议吗? 感谢您的宝贵时间!
这是因为您使用完整的 URL 作为文件名,但文件名中不能有斜线。您能否将文件命名为 URL 中的最后一位?那么这应该有效:
#!/bin/bash
for source in `cat lists.list`; do
echo $source
filename=$(sed -E 's@.+/@@' <<< $source).list # <-- remove everything up to and including the last slash
curl --silent "$source" -o "$filename"
echo -e "\t`wc -l $filename | cut -d " " -f 1` lines downloaded"
done