在 tcsh 中嵌套 foreach

问题描述 投票:0回答:1

我需要操作多个数据库客户端,这些客户端有一个静态名称 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 中。

shell sqlplus tcsh
1个回答
0
投票

忽略

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
© www.soinside.com 2019 - 2024. All rights reserved.