한 스크립트에서 다른 스크립트로 변수 전달

한 스크립트에서 다른 스크립트로 변수 전달

스크립트 간에 변수를 전달하는 방법은 무엇입니까?

예: 두 개의 테스트 스크립트가 있습니다.

-- test2.sh
#!/bin/bash
echo "this is test2.sh"
echo "varname is $varname"
echo end

-- tes1.sh
#!/bin/bash 
varname="123456"
ssh [email protected] 
"bash" < varname=$varname test2.sh

아이디어는 test1.sh원격 서버에 연결하고 실행하기 위해 실행한다는 것입니다 test2.sh. 그러나 내가 얻는 것은 .varName is 123456: No such file or directory

답변1

왜 매개변수로 전달하지 않나요? 즉.

test2.sh

#!/bin/bash
echo "this is test2.sh"
echo "varName is $1"
echo end

test1.sh

#!/bin/bash 
varName="123456"
scp test2.sh [email protected]:/tmp/
ssh [email protected] "/tmp/test2.sh $varName"
ssh [email protected] "rm -f /tmp/test2.sh"

답변2

"작업 순서" 유형의 문제가 있는 것 같습니다. <명령을 실행하기 전에 처리하여 비슷한 것을 실행하고 있습니다(정확히 동일하지는 않지만).

varname=$varname test2.sh | ssh [email protected] bash

로컬로 실행 test2.sh된 다음 해당 출력을 bash원격 서버로 보냅니다. 그렇기 때문에 출력이 표시되지만 test2.sh해당 출력을 명령으로 실행하려고 하면 오류가 발생합니다.

실행 가능한 스크립트를 실행하는 경우 실제로는 필요하지 않으므로 bash다음을 수행할 수 있습니다.

ssh [email protected] "varname=$varname ./test2.sh"

test2.sh원격 서버에서 사용할 수 있다고 가정합니다 .

원격 서버가 없고 test2.sh여전히 그곳에서 실행하려는 경우 다음을 수행할 수 있습니다.

ssh [email protected] varname="$varname" bash < test2.sh

bash이렇게 하면 스크립트 소스가 리디렉션되지만 실행 파일의 컨텍스트에서 변수 처리가 수행됩니다.

답변3

명령줄에서 프로세스 환경을 정의하려면 정의를 정렬해야 합니다.앞으로주문하다:

varname=$varname bash < $varname test1.sh

실제로 다음과 같은 파일을 열고 싶어할 것 같지 않습니다.

varname=${expansion_of_varname}

이것이 당신이하려는 일인 것 같지만. 이로 인해 문제도 발생할 것으로 예상됩니다. 네가 원한다면모든변수 할당은 모든 쉘 하위 환경에 영향을 미치므로 다음을 수행할 수 있습니다.

set -a

...첫번째.( x=; <${x:=file} sh -c 'echo "$x"'그래도 중간 세미콜론 없이는 작동하지 않는 것 같습니다.).

관련 정보