我需要访问动态创建的数组。
首先看一下代码:
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/someFolder
rsync
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='*'
: 忽略其他一切。