【问题标题】:Generating and running a perl script from a bash script从 bash 脚本生成和运行 perl 脚本
【发布时间】:2020-04-03 19:59:08
【问题描述】:

我正在尝试生成一个 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.

似乎无法弄清楚我在哪里错过了终结者

【问题讨论】:

  • 使用set -x 准确查看正在执行的内容
  • 啊哈! exec -c perl -e ''\''print' '"one' '";'\''' -e ''\''print' '"two' '";'\''' -e ''\''print' '"three' '";'\'''

标签: bash perl


【解决方案1】:

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[@]}"

【讨论】:

    【解决方案2】:

    不要这样做。与其与变量和所有创建的解析噩梦作斗争,不如将其写入文件并获取它。

    $: 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 
    

    但是....你为什么要这样做? =o]

    【讨论】:

    • 如果你还是要把它写到一个文件中,把 Perl 脚本本身写到一个文件中,而不是写一个 runs 将 Perl 脚本写入文件?
    • 这只是一个测试.. 它是一个更大的 bash 文件的一部分
    • @ruakh,是的,当然,如果以编程方式构建,有时将它们全部折叠成一行确实更容易。另一方面,我的想法是,如果它复杂到需要 Perl,那么是时候用 Perl 重写整个脚本了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2022-01-05
    相关资源
    最近更新 更多