我需要操作多个数据库客户端,这些客户端有一个静态名称 APPUSR,其 ID 为数字 (1,11,12,13 2,21,22,23 3,31,32,33 ...)。 APPUSR1,APPUSR12,APPUSR3,APPUSR32,....
我认为循环遍历十位和其他单位循环来创建连接名称 -
#!/usr/bin/tcsh
set echo
foreach envMast ( `seq 4 ` )
foreach envClient ( `seq 0 3 ` )
if ( "$envClient" == 0) then
set envClient = "" #there is not user 10,20,30 so i blank unit 0 to get envMast 1 2 3 4
endif
sqlplus APPUSR${envMast}${envClient}/APPUSR${envMast}${envClient}@DB <<-EOT>APPUSR.log
SELECT USER FROM DUAL;
exit
EOT
end
end
它运行正常,但仅适用于 APPUSR1 一次。
也许是一个简单的逻辑错误(我是 tcsh 的新手),但不知道为什么它没有迭代或循环到任何 foreach 中。
忽略
sqlplus
命令,您的嵌套 foreach 已正确构建。
您看到的问题是因为
<<EOT
和 EOUT
之间的“此处文档”在 foreach 循环内不起作用。 这在 tcsh 中不起作用。 (请参阅错误部分https://linux.die.net/man/1/tcsh)
您需要找到一种以不同方式构建 sqlplus 命令的方法。 也许您可以将这些行移动到另一个文件中,然后从 csh 脚本中获取该文件,如下所示:
foreach envMast ( `seq 4 ` )
foreach envClient ( `seq 0 3 ` )
if ( "$envClient" == 0) then
set envClient = ""
endif
source sqlcmd.csh >> APPUSR.log
end
end