Bash에서 따옴표와 공백이 포함된 변수

Bash에서 따옴표와 공백이 포함된 변수

Bash 스크립트에서 다음을 시도하고 있습니다.

MV_PARAMS='"foo 1" "foo 2"'
mv $MV_PARAMS

제가 실제로 하고 싶은 일은 다음과 같습니다.

mv "foo 1" "foo 2"

그러나 이것은 작동하지 않는 것 같습니다. 이 시도:

mv "$MV_PARAMS"

아니요.

답변1

당신이 해야 할 일은 배열을 사용하는 것입니다:

mv_params=("foo 1" "foo 2")
mv "${mv_params[@]}"

배열 확장은 공백이나 특수 문자가 포함된 배열 요소를 올바르게 처리합니다.

답변2

쉘 스크립트에서 파일 이름의 공백을 처리하는 것은 복잡한 경우가 많습니다. 이 경우 다음이 주어집니다.

MV_PARAMS='"foo 1" "foo 2"'

당신이 쓸 때 :

mv $MV_PARAMS

최종 쉘은 mv다음과 같이 실행됩니다:

execve("/usr/bin/mv", ["mv", "\"foo", "1\"", "\"foo", "2\""])

즉, 4개의 매개변수가 있습니다.

  • "부자
  • 1"
  • "부자
  • 2 인치

eval다음을 사용하여 쉘이 생성된 명령줄을 구문 분석하도록 할 수 있습니다 .

eval "mv $MV_PARAMS"

이것은 당신이 원하는 것을 할 것입니다. 때로는 사용하기 eval까다로울 수 있으며 , eval이것이 해결책인 것처럼 보이는 상황에서는 종종 필요하지 않도록 무언가를 다시 작성하려고 합니다.

관련 정보