【问题标题】:SSH command option with bash for loop带有 bash for 循环的 SSH 命令选项
【发布时间】:2012-11-11 08:46:03
【问题描述】:

我想符号链接两个数组的元素。例如,array1 = (AAA BBB CCC DDD)array2 = (001 002 003 004)001->AAA002->BBB003->CCC004->DDD

这是我写的shell脚本,但它不起作用,我也想不出哪里出错了。

declare -a array1=(AAA BBB CCC DDD)
declare -a array2=(001 002 003 004)
num = ${#array1[@]}
ssh username@hostmachine 'for((i = 0 ; i < $num ; i++ )); do ln -sf ${array1[$i]} ${array2[$i]}; done' 

谁能给我一些提示/建议?提前谢谢你。

【问题讨论】:

  • 同时发布您收到的错误消息。

标签: arrays linux bash for-loop ssh


【解决方案1】:

您应该在ssh 的参数中包含所有 bash 代码,如下所示:

ssh username@hostmachine 'declare -a array1=(AAA BBB CCC DDD); declare -a array2=(001 002 003 004); num = ${#array1[@]}; for((i = 0 ; i < $num ; i++ )); do ln -sf ${array1[$i]} ${array2[$i]}; done'

因为否则 ssh bash 代码将无法访问您之前定义的数组,因为它们是在您的计算机中定义的,而不是在 ssh 计算机中。

【讨论】:

  • @Nelson 这似乎有效:myArray="onething anotherthing"; ssh myhost "for myValue in ${myArray[@]}; do echo \$myValue; done;"但这不是: myArray="onething anotherthing"; ssh thufirg-0105 "for ((i=0; i
【解决方案2】:

乍一看,我会说您在循环中缺少最后一个 done

ssh username@hostmachine 'for((i = 0 ; i < $num ; i++ )); do ln -sf ${array1[$i]} ${array2[$i]}; done'

【讨论】:

  • 糟糕,错过了输入。但是,我的脚本在该行中已经“完成”了,但它仍然无法正常工作。
  • 没有明显错误,只是没有在远程机器上链接任何东西。
  • @user1846268 这很奇怪。我在没有ssh 的情况下尝试了您的 sn-p,它按预期工作。 ssh 会询问您的密码吗?有输出吗?
  • 是的,没有 ssh,它可以正常工作。我确实输入了正确的密码,但它在“主机”上没有按预期工作。顺便说一句,只有每个数组中的第一个元素被链接到“主机”上,即:001->AAA。没有其他人。
【解决方案3】:

变量替换不会发生在单引号内。改用双引号:

declare -a array1=(AAA BBB CCC DDD)
declare -a array2=(001 002 003 004)
num=${#array1[@]}
ssh username@hostmachine "for((i = 0 ; i < $num ; i++ )); do ln -sf ${array1[$i]} ${array2[$i]}; done"

【讨论】:

  • 是的,我也试过了,只有每个数组中的第一个元素会链接到“主机”上,即:001->AAA。没有其他人。似乎 '$i' 没有以某种方式正确迭代。
  • 是的,我想得越多,我就越相信你需要重写你的解决方案。主机无法访问您的环境,因此您也需要在 ssh 命令中提供它(它不知道 array1、array2 或 num 是什么)。
  • 讲魔鬼,看纳尔逊的回答
猜你喜欢
  • 2019-11-14
  • 2014-01-20
  • 1970-01-01
  • 2019-10-11
  • 2017-05-11
  • 2015-01-26
  • 2020-09-24
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多