我是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 found
,DIR
和FILE
出现LOGFILE
错误。
怎么纠正呢?
还有如何去解析部分?
答案 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结尾时失败。