bash는 확장 변수에 아포스트로피를 추가합니다.

bash는 확장 변수에 아포스트로피를 추가합니다.

각 줄이 다음과 같은 여러 열로 구성된 bash 스크립트에서 파일을 읽고 있습니다.

ANSIBLE 'first run' '--diff --extra-vars "client=yes fast=no"'

보시다시피 행은 아포스트로피 안에 공백이 있는 세 개의 열로 구성됩니다. 세 번째 열에는 호출할 바이너리에 대한 옵션이 포함되어 있습니다. 파일을 읽을 때 다음 옵션을 변수에 저장합니다.

custom_options=${columns[2]}

이는 다음과 같이 평가됩니다.

custom_options='--diff --extra-vars "client=yes fast=no"'

이제 다음 옵션을 사용하여 바이너리를 실행하고 싶습니다.

ansible-playbook $custom_options site.yml

그러나 실행 시 내부 문자열 주위에 아포스트로피가 추가되기 때문에 실패합니다.

ansible-playbook --diff --extra-vars '"client=yes fast=no"' site.yml

변수 문자열을 그대로 바꾸는 방법을 아는 사람이 있습니까?

다음은 동작을 빠르게 재현하기 위한 짧은 스크립트입니다.

#!/bin/bash
set -x
touch "as is"
command='-name "as is"'
find . $command -type f

답변1

해결책이 아닌 해결책을 찾았습니다. 전체 명령을 표현식 내부의 변수로 묶었습니다 eval.

eval "ansible-playbook $custom_options site.yml"

다음은 예제 스크립트의 동등한 사용법입니다.

...
eval "find . $command -type f"

저는 bash 전문가가 아니며 이 해결 방법에 부작용이 있는지 모르겠습니다. 그럼에도 불구하고 다음을 테스트했습니다.

  • eval은 파이프에서 작동합니다.eval "command | tee file"
  • eval 내부에 따옴표를 붙일 수 있습니다:eval "command \"${var}\""

내 요구 사항에는 맞았지만 더러운 느낌이 들었습니다. 더 나은 솔루션을 환영합니다.

관련 정보