Bash

在 bash 腳本中退出 SSH 後需要訪問數組

  • March 10, 2019

我需要訪問動態創建的數組。

首先看程式碼:

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

--includeand--exclude模式從左到右應用,第一個匹配很重要:

  • --include='*/':查看所有子目錄(空目錄,即沒有匹配文件名的目錄,由於 沒有傳輸--prune-empty-dirs)。
  • --include='something*':與我們真正感興趣的事物相匹配的模式。
  • --exclude='*': 忽略其他。

引用自:https://unix.stackexchange.com/questions/453236