변수에 문자열이 저장되어 있습니다. 이게 내가 원하는 결과야...
cmd="--name=cloudflare-ddns \
--hostname=oznu-cloudflare-ddns \
--env=SUBDOMAIN=private \
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--env=QEMU_ARCH=x86_64 \
--env=S6_KEEP_ENV=1 \
--env=S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \
--env=CF_API=https://api.cloudflare.com/client/v4 \
--env=RRTYPE=A
--env='CRON=*/5 * * * *' --env=PROXIED=false \
--env=ZONE=thebiermans.net \
--env=API_KEY=kka \
--network=host \
--restart=always \
--log-driver=db --runtime=runc --detach=true -t oznu/cloudflare-ddns:latest"
실행할 수 있도록 변수에 어떻게 저장합니까?
예를 들어
docker run $CMD
여기에 올바른 이스케이프 세트가 누락되어 잘못된 출력이 나타납니다.
답변1
eval
쉘이 변수에 저장된 쉘 코드를 평가하도록 하려면 특별한 내장 명령을 사용할 수 있습니다 . 이는 다른 여러 언어에서도 마찬가지입니다.
cmd="--name=cloudflare-ddns \
--hostname=oznu-cloudflare-ddns \
--env=SUBDOMAIN=private \
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--env=QEMU_ARCH=x86_64 \
--env=S6_KEEP_ENV=1 \
--env=S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \
--env=CF_API=https://api.cloudflare.com/client/v4 \
--env=RRTYPE=A
--env='CRON=*/5 * * * *' --env=PROXIED=false \
--env=ZONE=thebiermans.net \
--env=API_KEY=kka \
--network=host \
--restart=always \
--log-driver=db --runtime=runc --detach=true -t oznu/cloudflare-ddns:latest"
eval "docker run $cmd"
이는 쉘 구문에서 유효한 코드의 연결 "docker run "
및 내용을 가정합니다. 이 경우 코드를 해석하면 매개변수 목록이 포함된 명령이 $CMD
실행됩니다 .docker
변수에 저장된 인수 목록을 사용하여 명령을 실행하려면 배열 변수를 사용할 수 있습니다.
args=(
--name=cloudflare-ddns
--hostname=oznu-cloudflare-ddns
--env=SUBDOMAIN=private
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
--env=QEMU_ARCH=x86_64
--env=S6_KEEP_ENV=1
--env=S6_BEHAVIOUR_IF_STAGE2_FAILS=2
--env=CF_API=https://api.cloudflare.com/client/v4
--env=RRTYPE=A
--env='CRON=*/5 * * * *'
--env=PROXIED=false
--env=ZONE=thebiermans.net
--env=API_KEY=kka
--network=host
--restart=always
--log-driver=db --runtime=runc --detach=true
-t oznu/cloudflare-ddns:latest
)
docker run "${args[@]}"
어쨌든, bash에서는 목록 컨텍스트에 인용되지 않은 매개변수 확장을 두지 마십시오. 이렇게 하면 원하는 효과를 거의 얻을 수 없습니다. 이를 수행하는 것은 변수의 내용을 문자로 분할한 $IFS
다음 각 결과 단어에 대해 파일 이름 생성을 수행하는 분할+글로브 연산자입니다. 이는 쉘 구문 토큰화 및 구문 구문 분석과 전혀 관련이 없습니다.예예를 들어, 인용된 부분을 식별하고 해석합니다.