다음 스크립트를 실행합니다.
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"'