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
相关产品推荐
相关产品推荐

