로컬 및 원격 변수 혼합 및 올바른 사용법 및 참조

로컬 및 원격 변수 혼합 및 올바른 사용법 및 참조

내가 아는 한, bash에서 권장되는 패턴은 항상 쉘 변수를 인용하는 것입니다.
"$VAR"를 들어 $VAR.
대신 따옴표가 해석될 변수에 제공하는 것과 동일한 안전성을 어떻게 얻을 수 있습니까?떨어져서?
예를 들어 다음과 같습니다.

ssh server.com<<CODE
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )  
echo \$COUNT > count.txt    

CODE   

코드가 작동하려면 $COUNT및 를 이스케이프해야 합니다 $TARGET.
그러나 이 특정 사례에 대해 "$COUNT" 또는 "$TARGET"이 제공하는 것과 동일한 보안을 어떻게 달성할 수 있습니까?

고쳐 쓰다
문제가 있는 부분만 붙여넣었습니다.
변수가 구분된 문서 외부에 정의된 다른 줄이 있으므로 <<'CODE'.
더 완전한 예:

SOME_STRING="SOME VALUE"  
ssh server.com<<CODE  
echo $SOME_VALUE > test_file.txt  # <--- does not work if I use <<'CODE'
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )  
echo \$COUNT > count.txt    

CODE   

답변1

이 문서에서는 큰따옴표가 유지되는 것 같습니다. 예를 들어 다음 명령을 고려해보세요.

cat <<HEREDOC
"this will still be quoted"
HEREDOC

그러면 출력으로 다음과 같은 인용 문자열이 생성됩니다.

"this will still be quoted:

따라서 평소와 같이 변수를 참조할 수 있어야 합니다.

SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo "$SOME_VALUE" > test_file.txt
TARGET="target dir"
COUNT="\$( ls /foo/bar/\$TARGET | wc -l )"
echo "\$COUNT" > count.txt
CODE

명령 대체에서 변수를 참조하는 방법은 다음 게시물을 참조하세요.Bash에서 $(명령 대체) 내에서 인용

SOME_STRING코드 조각을 그대로 복사했지만 대신 변수를 사용하려고 했던 것 같습니다 SOME_VALUE. 다음은 로컬에서 실행하여 예상 결과를 얻을 수 있는 약간 수정된 코드 조각입니다.

mkdir -p "/foo/bar/target dir"

SOME_STRING="SOME VALUE"
ssh localhost<<CODE
echo "$SOME_STRING" > test_file.txt
TARGET="target dir"
COUNT="\$( ls "/foo/bar/\$TARGET" | wc -l )"
echo "\$COUNT" > count.txt
CODE

답변2

지난 며칠 동안 우리는 이 문제에 대해 많은 다른 의견을 가지고 있는 것 같습니다.

이 경우 여기에 있는 문서를 인용하세요.

ssh server.com <<'CODE'
TARGET="target dir"
COUNT= $( ls /foo/bar/$TARGET | wc -l )  
echo $COUNT > count.txt    
then  
fi  
CODE  

'CODE'(only와 반대) CODE은 변수를 확장하거나 명령 대체를 수행하지 않고도 here 문서가 작성된 대로 유틸리티에 전달되도록 합니다.

여기 문서에도 구문 오류가 있습니다(주변 공백 =및 불일치 if) then. 또한 평소와 같이 확장을 $COUNT큰따옴표로 묶어야 합니다 $TARGET.

ssh server.com <<'CODE'
TARGET="target dir"
COUNT=$( ls "/foo/bar/$TARGET" | wc -l )  
printf '%s\n' "$COUNT" >count.txt    
CODE 

원격 디렉터리의 파일 수를 계산하려는 경우 다음 명령을 사용합니다.

ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \;' | wc -l

이렇게 하면 올바르게 계산됩니다 /path/to/dir.

결과를 원격 파일에 쓰려면:

ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \; | wc -l >file'

원격으로 실행해야 하는 코드가 매우 복잡한 경우 서버에서 스크립트를 만들어 실행하는 것이 더 나을 수 있습니다. 스크립트에 전달해야 하는 변수는 명령줄에서 전달할 수 있습니다.

ssh server ./script.sh "$SOME_VARIABLE"

스크립트:

#!/bin/sh

VAR="$1"

# do stuff

관련 정보