Генерация и запуск скрипта perl из скрипта bash - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь сгенерировать сценарий perl и запустить его из сценария bash, но у меня возникают проблемы:

#!/bin/bash
str="perl"
array=( one two three )
for i in "${array[@]}"
do
   str=$str" -e 'print \"$i \";'"
done
echo "$str"
echo "AND THE PERL OUTPUT: "
$str

создает вывод:

perl -e 'print "one ";' -e 'print "two ";' -e 'print "three ";'
AND THE PERL OUTPUT:
Can't find string terminator "'" anywhere before EOF at -e line 1.

Когда я запускаю сгенерированную команду perl perl -e 'print "one ";' -e 'print "two ";' -e 'print "three ";' вручную, она работает, но когда я пытаюсь запустить ее из сценария bash, я получаю Can't find string terminator "'" anywhere before EOF at -e line 1.

Не могу понять, где Мне не хватает терминатора

Ответы [ 2 ]

5 голосов
/ 03 апреля 2020

bash рассматривает 'print как единое целое, он обнаружил открытие ', но не смог найти закрывающий (терминатор строки).

Это более безопасная версия:

#!/usr/bin/env bash

str=(perl)
array=( one two three )
for i in "${array[@]}"
do
   str+=(-e "print '$i ';")
done
echo "${str[@]}"
echo "AND THE PERL OUTPUT: "
"${str[@]}"
1 голос
/ 03 апреля 2020

Не делай этого. Вместо того, чтобы бороться с переменной и всем кошмаром разбора, который создает, запишите его в файл и отправьте его в исходное состояние.

$: cat tst
#!/bin/bash
tmp=$(mktemp)
array=( one two three )
{ printf "perl"
  printf " -e 'print \"%s \";'" "${array[@]}"
  echo
} >| $tmp

printf "the script:\n===\n"
cat $tmp
echo "AND THE PERL OUTPUT: "
. $tmp
rm $tmp

$: ./tst
the script:
===
perl -e 'print "one ";' -e 'print "two ";' -e 'print "three ";'
AND THE PERL OUTPUT:
one two three 

Но .... зачем вам это делать? = О]

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