Bash
在 bash 腳本中退出 SSH 後需要訪問數組
我需要訪問動態創建的數組。
首先看程式碼:
ssh username@11.22.333.44 <<'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 之後訪問數組。
由於您習慣使用反引號並
find
構造數組,因此您顯然不必過於擔心穩健地序列化數據(例如,輸出中的空格find
將被拆分為數組的不同元素,這可能不會需要),所以就這樣做:array=($( ssh username@11.22.333.44 sh -c "find . -name 'something*'"))
並在本地主機上建構陣列。
從您的一條評論看來,您似乎打算創建一個文件的路徑名列表,您希望使用
scp
. 這樣做的問題是您在兩個系統之間來回傳遞路徑名,這引入了包含空格字元的文件名可能被破壞的風險。如果您正在尋找一種方法來從遠端機器上的
something*
某處傳輸所有匹配的文件/home/ubuntu/user/someFolder
,您可以rsync
這樣使用:rsync -av --include='*/' --include='something*' --exclude='*' \ --prune-empty-dirs \ username@11.22.333.44:/home/ubuntu/user/someFolder/ ./target
這將找到所有匹配模式和它們所在目錄結構的文件並將其傳輸到路徑下的本地電腦
./target
。
--include
and--exclude
模式從左到右應用,第一個匹配很重要:
--include='*/'
:查看所有子目錄(空目錄,即沒有匹配文件名的目錄,由於 沒有傳輸--prune-empty-dirs
)。--include='something*'
:與我們真正感興趣的事物相匹配的模式。--exclude='*'
: 忽略其他。