Выполнить команду (функцию) из переменной в скрипте - PullRequest
0 голосов
/ 24 ноября 2018

Итак, я хочу создать скрипт, где я проверяю что-то с веб-сайта.У меня есть текстовый файл с разными сайтами, и я хочу проверить все сайты одновременно.Для этого я создаю команду шаг за шагом в переменной, вызывающей функцию, которая будет проверять каждый веб-сайт.Это мой код:

checkWebsite(){
    WEBSITE="$2"
    echo "Parameter is $WEBSITE"
}

COUNTER=0;

input=websites.txt

myCommand=()
while IFS= read -r line
do
    if [[ "$line" != "#"* ]]; #ignoring comments if there are any
    then
        myCommand[COUNTER]="checkWebsite $line"
        COUNTER=$((COUNTER + 1))
        myCommand[COUNTER]=" & "
        COUNTER=$((COUNTER + 1))
    fi
done < "$input"

unset 'myCommand[${#myCommand[@]}-1]' #deleting the last " & "

echo "MY COMMAND: "
echo ${myCommand[@]}
echo " "

echo ${myCommand[0]}
checkWebsite ${myCommand[0]}
"${myCommand[0]}"

Это результаты: результаты

Как видите, если я вызываю функцию из скрипта, все в порядке, но еслиЯ вызываю функцию из переменной, она не работает.Я понимаю, почему это происходит (как будто я запускаю эту команду из терминала), но я не знаю, как заставить ее запускать функцию из сценария, когда я выполняю команду из переменной.Кто-нибудь знает, как я могу это сделать?

Заранее спасибо

1 Ответ

0 голосов
/ 24 ноября 2018

Не используйте здесь массив.Это вызывает много проблем и не добавляет никакой ценности.Вместо этого запустите фоновые задачи внутри цикла:

while IFS= read -r line; do
  [[ "$line" = "#"* ]] || checkWebsite "$line" &
done < "$input"

Если вы действительно хотите получить массив, заполните его из цикла и, опять же, запустите элементы по отдельности.без него.

websites=( )
while IFS= read -r line; do
  [[ "$line" = "#"* ]] || websites+=( "$line" )
done < "$input"

for site in "${websites[@]}"; do
  checkWebsite "$site" &
done

Почему не работает другой подход? Поскольку & действует только в качестве разделителя команд при синтаксическом анализе в качестве синтаксиса, а результаты расширения параметров равны data , а не синтаксис .

Youнужно будет использовать eval, чтобы результаты вашего синтаксического анализа анализировались как синтаксис;если это не сделано с большой осторожностью, это может привести к серьезным уязвимостям безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...