执行此shell脚本会发出命令not found错误

时间:2013-01-15 14:58:01

标签: shell unix wget

我是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 foundDIRFILE出现LOGFILE错误。 怎么纠正呢? 还有如何去解析部分?

3 个答案:

答案 0 :(得分:7)

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

VARIABLE=value

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

否则,它会尝试执行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

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

答案 1 :(得分: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上列出,或使用this one等在线资源)。我给它做了一个快速实验,看起来wget返回一个非零退出代码,即使其中一个URL触发了失败。

答案 2 :(得分:0)

我刚刚遇到了与tcsh : Command not found.

相同的错误消息

奇怪的是,它是由行结尾引起的。相同的确切脚本可以找到LF结尾,但是在CRLF结尾时失败。