下面的脚本使用CURL下载文件,我正在循环中尝试保存文件,还将已保存的文件名插入变量,然后打印。
我的脚本下载了该脚本并保存了文件,但是无法回显已保存的文件名:
for link in $url2; do
cd /var/script/twitter/html_files/ && file1=$({ curl -O $link ; cd -; })
echo $file1
done
脚本说明:
$ url2包含一个或多个URL
curl -O将输出写入名为远程文件的文件
答案 0 :(得分:0)
您的代码有几个问题。假设$url2
是不需要用引号引起来的有效URL的列表,则可以使curl
直接打印输出变量。
cd /var/script/twitter/html_files
for link in $url2; do
curl -s -w '%{filename_effective}\n' -O "$link"
done
如果没有-w
formatstring 选项,则curl
的输出通常不包含以方便机器可读的格式(或实际上根本没有)的输出文件名。我还添加了一个-s
选项,以默认禁用其输出的下载状态输出。
在循环内一遍又一遍地将cd
移到同一目录,或者将输出捕获到一个变量中,将其{{1}打印到标准输出,这仅用一次就没有意义了。 }本身会打印到标准输出。
最后,curl
在这里似乎没有任何用处;即使它本身做了一些有用的操作,您仍然在子shell中进行操作,这不会更改包含cd -
命令替换的脚本的当前工作目录。
如果您的任务是暂时切换到该目录,然后切换回开始的位置,只需$(cd -)
一次。您可以在Bash中使用cd
,但是更健壮和可移植的解决方案是在子shell中运行抓取操作。
cd -
如果您确实需要该变量,则可以轻松使用
( cd directory;
do things ...
)
# you are now back to where you were before the cd
,但显然变量将仅包含循环后最后一次迭代的结果(在for link in $url2; do
file1=$(curl -s -w '%{filename_effective}' -O "$link")
echo "$file1"
done
之后的代码中)。 (格式字符串在这里不需要最后的done
,因为命令替换将始终修剪掉所有尾随的换行符。)