好的,所以我有以下脚本来从网址列表中删除联系人详细信息(urls.txt)。当我从终端直接运行以下命令时,我得到了正确的结果
perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' http://url.com
然而,当我从脚本中调用上述命令时,我得到一个“没有这样的文件或目录”结果
以下是我的脚本
的副本#!/bin/bash
while read inputline
do
//Read the url from urls.txt
url="$(echo $inputline)"
//execute saxon-lint to grab the contents of the XPATH from the url within urls.txt
mydata=$("perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' $url ")
//output the result in myfile.csv
echo "$url,$mydata" >> myfile.csv
//wait 4 seconds
sleep 4
//move to the next url
done <urls.txt
我尝试将perl更改为./但得到相同的结果
任何人都可以告诉我这里出错的地方
我收到的错误是
./script2.pl: line 6: ./saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' http://find.icaew.com/listings/view/listing_id/20669/avonhurst-chartered-accountants : No such file or directory
提前致谢
答案 0 :(得分:4)
不要在命令替换中添加双引号。
不
mydata=$("perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' $url ")
# .......^...........................................................................................^
但是这个:
mydata=$(perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' $url )
使用双引号,你指示bash在路径,空格和所有内容中查找名为“perl saxon-lint.pl --html etc etc”的程序,显然没有这样的程序。
答案 1 :(得分:1)
你应该接受@ glennjackman的答案,因为这正是问题所在。这一行:
mydata=$("perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' $url ")
告诉shell运行此命令:
"perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' $url "
... 包括双引号。如果您在shell提示符下使用双引号键入它,您将从脚本中获得相同的“无此类文件或目录”错误消息。
关于剧本的其他几点说明:
url="$(echo $inputline)"
这是将第二个变量变成第一个变量的迂回方式。一个简单的url=$intputline
也可以使用,但您也可以首先使用read url
。不确定为什么你需要两个变量。
//output the result in myfile.csv
echo "$url,$mydata" >> myfile.csv
请注意,将包含用户提供的输入的变量作为第一个参数传递给echo
时,会产生意外行为的可能性。在这种情况下,它的可能性很小,因为URL不太可能以-
字符开头,但最好不要习惯;我会用printf
。另外,我不会在循环中追加每一行,而只是将循环的输出与输入一起重定向:
printf '%s,%s\n' "$url" "$mydata"
[...]
done <urls.txt >>myfile.csv
如果您不希望myfile.csv
存在或者您需要保留在循环顶部的任何内容,则可以将其更改为单个>
并避免混乱的混合不同运行的输出。