我使用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