동적으로 생성된 배열에 액세스해야 합니다.
먼저 코드를 살펴보세요:
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
~에서당신의 댓글 중 하나, 당신이 하려는 일은 .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='*'
: 다른 것은 모두 무시하세요.