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*'"))

そしてlocalhostに配列を構築します。

答え2

~からあなたのコメントの1つ、あなたがしたいことは、.txtファイルを使用してリモートシステムからローカルシステムに転送したいファイルパス名のリストを作成するようですscp。問題は、2つのシステム間でパス名を前後に渡すため、スペース文字を含むファイル名が破損する危険性があることです。

リモートシステムのどこかに一致するすべてのファイルを転送する方法を探している場合は、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='*':他はすべて無視してください。

関連情報