인라인 쉘 스크립트에 변수를 보내는 방법은 무엇입니까?

인라인 쉘 스크립트에 변수를 보내는 방법은 무엇입니까?

다음 스크립트를 실행합니다.

VAR="Test"
sh -c 'echo "Hello $VAR"'

하지만 나는 다음을 얻습니다.

# ./test.sh
Hello

VAR을 사용하여 생성된 셸로 스크립트의 변수를 어떻게 보내나요 sh -c '...'?

답변1

환경 변수로 변환 하거나 export명령에 직접 전달하십시오.

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

보간을 허용하기 위해 쉘 코드 주위에 큰따옴표를 사용하지 마십시오. 이렇게 하면 아래와 같이 명령 주입 취약점이 발생할 수 있습니다.

sh -c " echo 'Hello $VAR' "

$VAR다음과 같은 내용을 포함할 때 호출되는 경우';reboot #

답변2

sh -c변수를 위치 인수로 전달하는 또 다른 방법은 다음과 같습니다.

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}

답변3

환경 변수로 내보내지 않으려면 다음 트릭을 사용할 수 있습니다. 변수 정의를 파일에 저장 .var_init.sh하고 다음과 같이 서브셸에서 가져옵니다.

.var_init.sh

VAR="Test"

명령줄에서:

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'

이렇게 하면 서브셸을 실행할 때만 변수를 설정하면 됩니다.

답변4

"enharmonic" 게시물 덕분에 문제가 해결되었습니다. "/etc/docker/daemon.json" 파일이 아직 존재하지 않는 경우 추가하려면 이 명령을 변경해야 했습니다.

sudo echo "{ ${dqt}insecure-registries${dqt} : [${dqt}$ipaddress:5000${dqt}] }" >> $dockdaemoncfg

이 명령은 변수 "$ipaddress" 및 "${dqp}"(큰따옴표 dqt='"')의 내용을 유지할 수 없고 파일의 위치에 쓰지 않았기 때문에 변경되어야 했습니다. "enharmonic" 솔루션 덕분에 다음과 같이 성공적으로 변경했습니다.

sudo VAR1="$IPaddress" VAR2="$dockdaemoncfg" bash -c 'echo "{ \"insecure-registries\" : [\"$VAR1:5000\"] }" >> "$VAR2"'

관련 정보