You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell传参至Expect脚本问题:参数换行致命令执行失败

问题解决:参数与命令分行的修复方案

问题根源

从sqlplus提取的结果包含换行符、回车符或多余空格,导致传递给Expect脚本后,send命令将参数拆分成了新行执行。

修复步骤

1. 修正script_a.sh:清理SQL输出的多余空白

修改数据库提取脚本,确保输出的参数没有换行、回车和冗余空格:

#!/bin/bash
# 修正SQL语句的赋值(添加引号避免语法错误)
SQL_QUERY="select value from table A"
# 通过sqlplus获取结果并清理格式
SQL_OUTPUT=$(sqlplus -S username/pwd@database <<EOF
set heading off;
set feedback off;
set trimspool on;  # 移除输出行的尾部空格
$SQL_QUERY
exit;
EOF
| tr -d '\n\r' | xargs)  # 删除换行/回车,压缩多余空格

sh script_b.sh "$SQL_OUTPUT"

2. 优化script_b.sh:精准匹配+二次清理参数

修改远程执行脚本,确保参数传递时无换行,同时精准匹配远程shell的提示符,避免提前发送命令:

#!/bin/sh
# 对传入的参数再次清理,确保无残留换行
SQL_OUTPUT=$(echo "$1" | tr -d '\n\r' | xargs)

/usr/local/bin/expect <<-EOF
spawn ssh userid@remotehost
expect "password:"  # 精准匹配密码输入提示
send "password\n"
expect -re "\$ "  # 匹配远程主机的提示符(如userid@remotehost$)
send "test123 ${SQL_OUTPUT}\n"
expect -re "\$ "
send "exit\n"
expect eof
EOF

关键说明

  • set trimspool on:sqlplus的内置参数,用于移除查询结果行的尾部空格,减少后续格式清理的工作量。
  • tr -d '\n\r':彻底删除输出中的换行符和回车符,避免参数被拆分成多行。
  • xargs:自动压缩连续的空格,确保参数是单一的字符串。
  • 精准匹配提示符:避免使用expect "*"这种宽泛的匹配,防止在远程shell未完全就绪时发送命令,导致命令拆分。

内容的提问来源于stack exchange,提问作者Toonzen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:49:56