Oracle 19c PDB执行dbsat命令出现多余单引号问题求助
解决Shell脚本中dbsat collect命令多余单引号的问题
问题分析
当前命令写法存在两个核心问题:
- 不必要地使用
$()捕获命令输出赋值给CMD,同时错误嵌套引号,导致最终传递给dbsat的参数被额外包裹了单引号; - 重定向逻辑矛盾:先将命令输出丢弃到
/dev/null,再试图追加到日志文件,实际不会产生任何日志内容。
修正方案
根据需求直接调整命令写法,正确处理参数引号并修正重定向:
方案1:直接用双引号包裹完整连接串
如果dbsat接受的连接串格式是/ as sysdba@PDB_NAME(无需外层双引号),可以这样写:
$usrAppDir/dbsat collect -n "/ as sysdba@${PDB}" $usrAppWrkDir >> $sSLog 2>&1
双引号会将包含空格的连接串作为一个完整参数传递,避免Shell拆分空格,同时不会添加多余的单引号。
方案2:保留连接串的外层双引号
如果dbsat要求连接串必须带有外层双引号(即"/ as sysdba"@PDB_NAME),可以通过单引号+变量拼接的方式构造参数:
$usrAppDir/dbsat collect -n '"/ as sysdba"@'"${PDB}" $usrAppWrkDir >> $sSLog 2>&1
这里用单引号固定"/ as sysdba"@部分,再直接拼接${PDB}变量,组合后恰好是你期望的参数格式,不会引入多余单引号。
关键说明
- 去掉
CMD=$()的赋值逻辑:无需捕获命令输出到变量,直接执行命令并重定向日志即可; - 调整重定向位置:
>> $sSLog 2>&1会将标准输出和错误输出都追加到日志文件,替代原命令中矛盾的重定向写法; - 引号使用原则:Shell中双引号用于包裹包含空格/变量的字符串,单引号用于固定纯文本内容,避免嵌套导致的引号混乱。
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

