1

我是 shell 脚本的新手。我正在尝试编写一个脚本,该脚本逐行从文本文件中读取 URL,然后使用wget. 我还需要解析日志文件以获取错误消息。

#!/bin/sh
# SCRIPT:  example.sh

#reading the url file line by line

DIR = /var/www/html/

# wget log file
LOGFILE = wget.log

# wget output file
FILE = dailyinfo.`date +"%Y%m%d"`

cd $DIR

FILENAME = url.txt
cat $FILENAME | while read LINE
do
    echo "$LINE"
    wget $LINE -O $FILE -o $LOGFILE
done

我已经更改了使用权限,chmod +x example.sh 但在执行时我得到command not foundDIR,FILELOGFILE. 如何纠正它?另外如何进行解析部分?

4

3 回答 3

7

问题#1,在分配变量时,您必须使用以下语法:

VARIABLE=value

即在VARIABLEthe=和新值之间没有空格。

否则,它会尝试VARIABLE作为命令执行,这会触发command not found错误。

#!/bin/sh
# SCRIPT:  example.sh

#reading the url file line by line

DIR=/var/www/html/

# wget log file
LOGFILE=wget.log

# wget output file
FILE=dailyinfo.`date +"%Y%m%d"`

cd $DIR

FILENAME=url.txt
cat $FILENAME | while read LINE
do
    echo "$LINE"
    wget $LINE -O $FILE -o $LOGFILE
done

可能会通过命令未找到错误

于 2013-01-15T15:02:00.197 回答
2

Petesh 当然是正确的,您需要将=符号直接放在变量名之后。

对于这种特殊情况,我建议您使用wget -i input-urls.txt -o logfile.txt,然后 grep 日志文件以查找错误。wget 的-i标志从文本文件中读取 URL 列表,并“wgets”每个 URL,从而节省您重新发明轮子的时间。

如果您想在 shell 脚本中使用它,请使用以下内容:

#!/bin/sh
DIR=/var/www/html/
# wget log file
LOGFILE=wget.log
# wget output file
FILE=dailyinfo.`date +"%Y%m%d"`

# just for debugging
cd $DIR
echo "wget-ing urls from $FILE and writing them to $FILE in $DIR. Saving logs to $LOGFILE"

wget -i $FILE -o $LOGFILE
grep -i 'failed' logfile.txt

这是来自日志文件的示例错误:

--2013-01-15 15:01:59--  http://foo/
Resolving foo... failed: nodename nor servname provided, or not known.
wget: unable to resolve host address ‘foo’

检查 wget 的返回码也很有用。0表示成功,非零值表示各种失败。您可以通过访问 shell 变量来检查它们$?

因此,结合它,这是一个示例脚本:

#!/bin/sh
wget -i input-urls.txt -o logfile.txt
if [ $? -eq 0 ]; then
    echo "All good!"
else
    # handle failure
    grep -i 'failed' logfile.txt
fi

如果您需要更多详细信息,wget 的返回代码列在手册页上(man wget或使用类似这样的在线资源)。我给了它一个快速的实验,看起来 wget 返回一个非零的退出代码,即使只有一个 URL 触发了失败。

于 2013-01-15T15:00:42.797 回答
0

我刚刚遇到了与 tcsh 相同的错误消息: Command not found.

奇怪的是,它是由行尾引起的。相同的脚本适用于 LF 结尾,但以 CRLF 结尾失败。

于 2013-10-03T06:09:10.017 回答