“wget:command not found”下载到$ PATH; wget已安装

时间:2016-06-07 19:20:26

标签: bash scripting wget

我希望这个Bash脚本能够:

  • 阅读并将文件内容分配给URLS
  • 提示用户输入下载内容的路径,并将其分配给PATH
  • 遍历URLS
  • 使用wget将内容下载到PATH。

这是我到目前为止所得到的:

#!/bin/bash
URLS=$(<urls.txt)

read -e -p "Please enter the path of the directory you'd like to save your files to: " PATH

for link in $URLS
do
    wget --background --tries=45 $URLS --directory-prefix $PATH
done
exit 0

我的预感是我没有正确使用$PATH wget,因为如果我发表评论--directory-prefix $PATH,脚本将正常运行。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

PATH是一个具有保留含义的环境变量:它用于查找要执行的二进制文件的位置。

使用非保留名称以避免覆盖它,例如path;这个约定是explicitly given in the POSIX specification,以避免覆盖对系统有意义的环境变量。重点引用:

  

IEEE Std 1003.1-2001的Shell和Utilities卷中的实用程序使用的环境变量名称仅由大写字母,数字和可移植字符集中定义的字符的“_”(下划线)组成,并且不会开始有一个数字。实现可以允许其他字符;申请应容忍此类名称的存在。大写和小写字母应保留其独特的身份,不得折叠在一起。 为应用程序保留包含小写字母的环境变量名称的名称空间。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。

...即使对于未明确export环境的shell变量也是相关的,因为对名称与环境变量(例如PATH)重叠的shell变量的赋值是隐式的覆盖后者。

因此,您的代码可能如下所示:

#!/bin/bash

read -e -p "Please enter the path of the directory you'd like to save your files to: " path

while IFS= read -r link; do
  wget --background --tries=45 --directory-prefix "$path" "$link"
done <urls.txt

另见:

  • BashFAQ #001,描述了从bash读取文件的最佳做法。
  • DontReadLinesWithFor,明确描述围绕使用for迭代将被解释为面向行的数据的注意事项。