Bash将保存的文件名插入变量

时间:2018-12-17 09:17:18

标签: bash

下面的脚本使用CURL下载文件,我正在循环中尝试保存文件,还将已保存的文件名插入变量,然后打印。

我的脚本下载了该脚本并保存了文件,但是无法回显已保存的文件名:

for link in $url2; do
    cd /var/script/twitter/html_files/ && file1=$({ curl -O $link ; cd -; })
    echo $file1
done

脚本说明:

$ url2包含一个或多个URL

curl -O将输出写入名为远程文件的文件

1 个答案:

答案 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,因为命令替换将始终修剪掉所有尾随的换行符。)