2016-08-26 4 views
0

Итак, у меня есть следующий скрипт, чтобы очистить контактные данные из списка URL-адресов (urls.txt). Когда я запускаю следующую команду прямо из терминала я получить правильный результатВыполнить скрипт Perl из сценария Bash

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 к ./, но получить тот же результат

может кто-нибудь посоветует, где я буду неправильно с Тхи s пожалуйста

ошибка, что я получаю это

./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

Попробуйте использовать абсолютный путь. –

+0

попытался, но тот же результат – PowerMan2015

+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) 

С двойными кавычками, вы сообщаете Баш искать программу под названием «Perl saxon-lint.pl --html и т.д. и т. д. »на пути, пространствах и всех, и явно не существует такой программы.

+1

Возможно, вы намеревались поставить кавычки вне подстановки команд, но для присвоений переменных они не являются строго необходимыми. –

1

Вы должны принять ответ @ glennjackman, так как это точно проблема. Эта линия:

mydata=$("perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' $url ") 

говорит оболочке запустить эту команду:

"perl saxon-lint.pl --html --xpath 'string-join(//div[2]/div[2]/div[1]/div[2]/div[2])' $url " 

... включая двойные кавычки. Если вы наберете это с помощью двойных кавычек в командной строке, вы получите то же сообщение об ошибке «Нет такого файла или каталога», которое вы получаете из своего сценария.

Пара других заметки на сценарии:

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 существовать или иметь все, что вы должны держать на вершине цикла, вы можете изменить это на один > и избежать возможности беспорядочных смесей вывода из разных прогонов.

+0

Да, включая их .. попробуйте ввести '' ls'' с кавычками в командной строке, и вы получите список каталогов. Оболочка не различает слова и строки. Все цитаты заключаются в том, что вам не нужно скрывать символы (включая пробелы). Для оболочки «ls» и 'ls' (и' 'ls'' и' \ ls' и 'l \ s' и' \ l \ s' ...) являются точно такими же (кроме цитируемые версии не будут вызывать поиск псевдонима). Если вы попробуете '' ls -l "', тогда вы получите сообщение об ошибке, потому что он ищет команду с именем 'ls -l', вместо поиска одного имени' ls' и запуская его с аргументом '-l '. –

Смежные вопросы