包含变量的单引号变量



我使用sqlplus从包含shell命令的列中获取数据。

cmd=`sqlplus -s username/password <<EOF
        set heading off
        set trimspool on
        set termout on
        set underline off
        set linesize 2000
        set pagesize 0
        SELECT exec_cmd
          FROM cmd_table
        exit;
        EOF`

execcmd包含一个shell变量作为参数

$ echo $cmd
script.sh $UP

script.sh:

#!/bin/sh
connection=$1
echo "exit" | `sqlplus -s -l $connection`

这将失败,因为$connection包含文字字符串$UP而不是$UP的值。

使用eval将字符串求值为命令:

eval "$cmd"

请小心,因为这将在当前进程中运行命令。它可能会更改变量或对脚本做其他意想不到的事情。显式调用子shell会更安全,它会在一个孤立的子进程中运行命令:

sh -c "$cmd"

要使后者工作,请确保导出UP

UP='...'
export UP
sh -c "$cmd"

此外,在script.sh中消除sqlplus周围的backticks。

echo "exit" | sqlplus -s -l $connection

最新更新