使用 ssh 迭代数组

use*_*495 1 arrays ssh bash

我正在尝试打开 ssh shell,然后运行一个数组以获取预期运行进程列表的状态。

这是我所拥有的:

procList=("sdb*" 'fepkrn' 'fepcmd' 'fepmts' 'fepxml' 'fepdbs' 'feprdc' 'feproot' 'fephist2' 'fepagent' 'feprpl gwnma' 'feprpl gwsun' 'feprpl gwper' 'feprpl gwlur')

ssh $1 "for(( p = 0 ; p < ${#procList[@]} ; p++ )); do echo ${procListNOC[$p]}; done"
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我无法遍历数组。我当前得到的输出:

sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
sdb*
Run Code Online (Sandbox Code Playgroud)

所以,我知道我的 for 循环正在工作,但是我还需要 echo(用 pgrep 命令替换)来运行整个数组。

per*_*eal 5

也许这个:

ssh localhost "for p in ${procList[@]}; do echo \$p ; done"
Run Code Online (Sandbox Code Playgroud)

也就是说,您需要在将数组发送到远程主机之前扩展该数组,因为它没有在那里定义。在您的情况下,您只是echo ${procListNOC[$p]};在发送之前扩展,并且它扩展为sdb*. 您可以看到您发送的命令如下:

echo "for(( p = 0 ; p < ${#procList[@]} ; p++ )); do echo ${procListNOC[$p]}; done"
Run Code Online (Sandbox Code Playgroud)

这会告诉你:

for(( p = 0 ; p < 14 ; p++ )); do echo sdb*; done
Run Code Online (Sandbox Code Playgroud)

如果您确实需要使用索引进行迭代:

ssh localhost "IFS=' ' read -a procList <<< \"${procList[@]}\";\
    for(( p = 0 ; p < \${#procList[@]} ; p++ )); \
    do echo \${procList[\$p]}; done"
Run Code Online (Sandbox Code Playgroud)

更新

如果您创建这样的脚本 [ remote.sh]:

#!/bin/bash
procList=("sdb*" 'fepkrn' 'fepcmd' 'fepmts' 'fepxml' 'fepdbs' 
  'feprdc' 'feproot' 'fephist2' 'fepagent' 'feprpl gwnma' 
  'feprpl gwsun' 'feprpl gwper' 'feprpl gwlur')

for p in ${procList[@]}; do
    pgrep $p
done
Run Code Online (Sandbox Code Playgroud)

你可以做:

scp remote.sh remotehost:~/
ssh remotehost sh remote.sh
Run Code Online (Sandbox Code Playgroud)

如果脚本很大,您可以考虑使用 rsync 来减少传输大小。