我正在尝试从Windows运行位于Linux服务器上的shell脚本。 shell 脚本执行两件事:
- 执行
sed
命令以替换同一目录中.sql文件中的文本。 - 使用
sqlplus
运行.sql文件。
外壳脚本:
!/bin/sh
arg1=$1
arg2=$2
arg3=$(echo $arg1 | tr '[:lower:]' '[:upper:]')
arg4=$(echo $arg2 | tr '[:lower:]' '[:upper:]')
echo $arg1
echo $arg2
echo $arg3
echo $arg4
sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql
sqlplus $arg2/$arg2@MYDB <<EOF
@sequence.$arg1.sql
exit;
(我的数据库位于同一个 Linux 服务器上。
1) 当我通过 MobaXterm 登录到服务器时脚本正常运行
- 使用
userID
连接到服务器。 - 设置
my_env
. cd
到外壳脚本的目录。- 使用
./myscript.sh
参数运行脚本。
2) 相同的 shell 脚本通过 .cmd 手动成功运行
- 在我的 Windows PC 上创建一个 Windows 脚本
test.cmd
。 在 .cmd 文件中,我有一行:
plink.exe -ssh userID@Server
弹出控制台窗口后,我重复步骤 2 到 4,脚本成功运行。
我未能做到这一点的是使整个过程自动化。
这是我尝试的.cmd文件中的行:
plink.exe -ssh userID@Server /myfilepath/myscript.sh %arg1% %arg2%
我可以看到在 shell 脚本中使用多个echo
正确传递的参数。但是,shell 脚本无法找到.sql文件。
错误日志:
/mypath/myscript.sh[1]: !/bin/sh^M not found [No such file or directory] myarg1value myarg2value :No such file or directory[myarg1value] /mypath/myscript.sh[12]: sqlplus: not found [No such file or directory]
我也在下面尝试过,但不幸的是结果相同:
plink.exe -ssh userID@Server -m command.txt
其中文件command.txt
包含:
. my_env
cd /filepath/
./myscript.sh %arg_with_actual_value%
我不知道为什么它不起作用,尤其是当 2) 有效且脚本相对简单时。
我是否错误地假设了plink
(路径、变量等)?
天鹅是唯一的出路吗?
我尽量不依赖另一个工具,因为我一直在使用plink
.
编辑:虽然行
sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql
无法在.sh上运行,我可以通过以下方式在 .cmd 文件本身上运行它:
plink.exe -ssh userID@Server sed -i "s/%arg3%/%arg4%/g" /myfilepath/sequence.%arg1%.sql
因此,我怀疑问题来自.sh文件没有运行所需的组件(即设置 env 变量、路径等)
这不是一个解决方案,但由于Martin Prikryl和Mofi的输入,部分修复了一些问题:
在命令.txt中,需要设置以下内容:
ORACLE_SID ORACLE_HOME
路径
设置这些后,SQLP和SED将正常工作。 但是,通过 plink 将值从 .cmd 传递到 Linux 的 shell 脚本似乎与传递的实际值有问题。 该变量将具有分配的值以及一些不可读的字符。 在这种情况下,
sqlplus $arg 2/$arg 2@MYDB
登录失败,因为 arg2 包含一些其他字符。
@sequence.$arg 1.sql
这一行也会失败,因为它将尝试打开 2 个文件,一个称为 sequence.myvalue,另一个称为"%s",我怀疑分配的变量包含某种不可读的下一行字符。
编辑:已修复,我们可以使用 sed 的相同处理方式 - 直接从 plink 运行 sqlplus,而不是在 Linux 中传递值和运行.sh脚本:
sqlplus $arg2/$arg2@MYDB @/myfilepath/sequence.%arg1%.sql