从Bash脚本执行Perl脚本

时间:2016-08-26 11:45:00

标签: linux bash perl

好的,所以我有以下脚本来从网址列表中删除联系人详细信息(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

提前致谢

2 个答案:

答案 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存在或者您需要保留在循环顶部的任何内容,则可以将其更改为单个>并避免混乱的混合不同运行的输出。