bash 脚本中退出 SSH 后需要访问数组

bash 脚本中退出 SSH 后需要访问数组

我需要访问动态创建的数组。

首先看一下代码:

ssh [email protected] <<'ENDSSH'
cd /home/ubuntu/user/someFolder
array=(`find . -name 'something*'`)
len=${#array[*]}

i=0
while [ $i -lt $len ]; do
    let i++
done
echo  "${array[*]}"  #here I can access array values
ENDSSH
#Just above i have exited from ssh & now I need to access array values but not getting.
echo  "${array[*]}" #here I'm unable to get array values
exit

我关心的是 ENDSSH 之后访问阵列。

答案1

由于您习惯使用反引号并find构造数组,因此您显然不太担心稳健地序列化数据(例如,输出中的空格find将被拆分为数组的不同元素,这可能不会是所期望的),所以只需这样做:

array=($( ssh [email protected] sh -c "find . -name 'something*'"))

并在本地主机上构建阵列。

答案2

你的评论之一,听起来好像您打算做的是创建一个文件路径名列表,您希望使用 .txt 文件将这些文件从远程系统传输到本地计算机scp。问题在于,您在两个系统之间来回传递路径名,这会带来包含空白字符的文件名可能被破坏的风险。

如果您正在寻找一种方法来传输远程计算机上something*某处匹配的所有文件,您可以像这样使用:/home/ubuntu/user/someFolderrsync

rsync -av --include='*/' --include='something*' --exclude='*' \
    --prune-empty-dirs \
    [email protected]:/home/ubuntu/user/someFolder/ ./target

这将找到所有与模式匹配的文件以及它们所在的目录结构,并将其传输到本地计算机的路径下./target

--include和模式--exclude从左到右应用,第一个匹配才是重要的:

  • --include='*/':查看所有子目录(空目录,即没有匹配文件名的目录,由于 不会被传输--prune-empty-dirs)。
  • --include='something*':与我们真正感兴趣的事物相匹配的模式。
  • --exclude='*': 忽略其他一切。

相关内容