我试图使用该fanout
命令获取 Unix 机器中某些耳朵的 MD5,但出现一些错误。
我的代码是:
ears=ear1-ear2
cluster=abc
dmgr=server1
k=$(expr `echo $ears | grep -o "-" | wc -l` + 1)
fanout "$dmgr" " umask 022 ; for k in $(seq 1 $k) ; do for i in $(echo $ears | cut -d'-' -f$k) ; do echo /appl/as/bin/md5 /appl/as/var/spool/ears/${cluster}/$i ; done ; done
我收到的错误如下:
ksh: 0403-057 Syntax error at line 2 : `2' is not expected.
并且无法参考$i
答案1
出现此错误的原因是命令$(seq 1 $k)
内部的插值fanout
。
让我解释...
运行seq 1 2
返回:
1
2
您将其放在双引号内,因此换行符将保留为重要文本。因此,扇出命令的计算结果如下:
fanout server1 'umask 022 ; for k in 1
2 ; do for i in ear2 ; do echo /appl/as/bin/md5 /appl/as/var/spool/ears/abc/ ; done ; done'
你ksh
不明白2
第二行的内容,所以它失败了。
您可以通过包含 来修复此问题xargs
,但随后您会遇到第二个潜在问题,即您将其用作k
循环计数器,但$k
在循环运行之前对 进行评估。此外,您还有一个子 shell,$ears
需要在脚本运行之前对其进行评估,但它在运行时更改的循环中使用。
我找到了一个手册页forfanout
但我不明白为什么当存在针对多个系统运行命令时,您要针对单个系统( server1
)运行循环。fanout
如果你能解释一下 a 之间的区别服务器和耳朵我也许可以建议一段更清晰的代码。不过,我的第一个建议可能是这样的:
ears='ear1,ear2'
cluster=abc
dmgr=server1
fanout "$dmgr" "/appl/as/bin/md5 /appl/as/var/spool/ears/${cluster}/{$ears}"