Bash에서 변수를 통해 옵션을 전달하는 것이 작동하지 않습니다.

Bash에서 변수를 통해 옵션을 전달하는 것이 작동하지 않습니다.

다음 명령을 실행할 때 매우 이상한 동작이 발생했습니다. 문제를 설명하겠습니다.

다음 간단한 bash 스크립트를 고려해보세요.

#!/bin/bash
zip -r /var/backup.zip /var/www -x /ignore_dir_1/\*

전체 www폴더를 재귀적으로 압축하고들어오지 못하게 하다 ignore_dir_1정말 괜찮습니다.

이제 다음과 같이 스크립트를 작성하세요.

#!/bin/bash
Exclude="/ignore_dir_1/\*"
zip -r /var/backup.zip /var/www -x $Exclude

오류 없이 실행되지만제외되지 않음 ignore_dir_1.

누구든지 이 동작을 설명할 수 있나요?

- 면책조항:
나는 다음 대안을 시도했습니다.
Exclude="/ignore_dir_1/*"
Exclude="/ignore_dir_1/***"

고쳐 쓰다:
@pLumo 덕분에 다음과 같이 변수를 따옴표 안에 넣어 문제가 해결되었습니다.

#!/bin/bash
Exclude="/ignore_dir_1/*"
zip -r /var/backup.zip /var/www -x "$Exclude"

이제 문제는 Exclude변수에 다음이 포함되어 있는지 여부 입니다.여러 폴더, 작동하지 않습니다. 즉, 다음과 같습니다.

#!/bin/bash
Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"

나는 그것을 시도했지만 "${Exclude}"결과가 없었습니다.

답변1

당신이 쓴다면 ...

Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"

, 단일 인수로 zip수신되며 $Exclude파일 사이의 공백을 경로의 일부로 처리합니다.


여러 매개변수를 명령에 전달하려면 를 사용해야 합니다 array.

Exclude=("/ignore_dir_1/*" "/ignore_dir_2/*")
zip -r /var/backup.zip /var/www -x "${Exclude[@]}"

이렇게 하면 항목이 개별적으로 확장되어 명령에 인수로 전달됩니다.

답변2

플루모의 닌자 :-P


배열을 사용하는 것이 좋습니다.

#!/bin/bash

echo "directory tree ---------------------------------------------------"

find

echo "without exclusions -----------------------------------------------"

echo zip -sf -r backup.zip .
     zip -sf -r backup.zip .

echo "with exclusions --------------------------------------------------"

declare -a Exclude=(ignore_dir_1/\* ignore_dir_2/\*)

echo zip -sf -r backup.zip . -x ${Exclude[@]}
     zip -sf -r backup.zip . -x ${Exclude[@]}

echo 'double quoted ${Exclude[@]} --------------------------------------'


echo zip -sf -r backup.zip . -x "${Exclude[@]}"
     zip -sf -r backup.zip . -x "${Exclude[@]}"

"테스트 실행" 전에 디렉토리 트리의 결과를 표시합니다.

$ ./script 
directory tree ---------------------------------------------------
.
./dir_0
./dir_0/file-1
./dir_0/file-2
./ignore_dir_1
./ignore_dir_1/file-11
./ignore_dir_1/file-12
./ignore_dir_2
./ignore_dir_2/file name with spaces
./ignore_dir_2/file-22
./ignore_dir_2/file-21
./script
without exclusions -----------------------------------------------
zip -sf -r backup.zip .
Would Add/Update:
  dir_0/
  dir_0/file-1
  dir_0/file-2
  ignore_dir_1/
  ignore_dir_1/file-11
  ignore_dir_1/file-12
  ignore_dir_2/
  ignore_dir_2/file name with spaces
  ignore_dir_2/file-22
  ignore_dir_2/file-21
  script
Total 11 entries (621 bytes)
with exclusions --------------------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/file-11 ignore_dir_1/file-12 ignore_dir_2/file-21 ignore_dir_2/file-22 ignore_dir_2/file name with spaces
Would Add/Update:
  dir_0/
  dir_0/file-1
  dir_0/file-2
  ignore_dir_1/
  ignore_dir_2/
  script
Total 6 entries (621 bytes)
double quoted ${Exclude[@]} --------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/* ignore_dir_2/*
Would Add/Update:
  dir_0/
  dir_0/file-1
  dir_0/file-2
  script
Total 4 entries (621 bytes)

관련 정보