저는 오래된 파일을 압축하는 스크립트를 작성하고 있는데 온라인 예제 중에서 다음을 발견했습니다. "${files[@]}"
특수문자의 의미나 읽는 방법에 대해 자세히 알고 싶습니다 ."${files[@]}"
files=($(find /var/cdrs -maxdepth 1 -name \*.C*R -mtime +150))
tar cvfz /var/cdrs_backup/CDRBackup_$(date +%Y%m%d_%H%M%S).tar.gz "${files[@]}"
답변1
즉, files
배열을 만들고 확장합니다.
당신은 다음과 같이 읽었습니다.
VAR=...
변수를 할당한다는 의미입니다. VAR=(...)
bash 배열을 변수에 할당한다는 의미입니다.
$(...)
이는 명령을 실행하고 해당 출력을 캡처한다는 의미입니다. 귀하의 경우 이는 주어진 패턴과 일치하는 파일 목록이며 매우 오래된 파일 목록이며 각 파일을 bash 배열의 요소에 할당합니다.
${...}
변수 값을 읽고 있음을 나타냅니다. 예를 들면 다음과 같습니다.
$ SOMEVAR="a value"
$ echo "${SOMEVAR}"
a value
Bash에서는 $VAR
와 ${VAR}
동일하지만 ${VAR}
표기법을 사용하면 몇 가지 추가 작업을 수행할 수 있습니다. 가장 주목할만한 점은 변수를 확장하고 문자열 과 연결하는 echo "${VAR}iable"
대신 변수를 확장하려고 시도한다는 것입니다 . 당신도 할 수 있습니다$VAR
iable
echo $VARiable
$VARiable
고급 대안기호를 사용하세요 ${...}
.
우리의 경우에는 파일 변수를 읽고 있습니다 ${file...}
. 다음으로, [...]
우리가 읽고 있음을 나타냅니다.배쉬 배열. 그래서 우리는 파일 배열의 요소에 액세스하려고 합니다. 내부 비트는 어떤 요소에 액세스할 수 있는지, 첫 번째 요소에 액세스 [...]
할 수 있는지, 두 번째 요소에 액세스할 수 있는지 등을 알려줍니다 . (bash 배열은 0이 아닌 1부터 인덱스가 지정됩니다.) 모든 요소를 의미하므로 bash 배열의 모든 요소에 액세스하려고 합니다 .1
2
@
file
다음 방법을 시도해 볼 수 있습니다.
% ARRAY=("a value" "another value" "fred")
% for x in "${ARRAY[@]}"; do echo "$x"; done
a value
another value
fred
공백으로 구분된 문자열을 사용하는 것에 비해 배열을 사용하면 위와 같이 값에 공백을 포함할 수 있다는 장점이 있습니다. 따라서 귀하의 경우 배열의 각 파일은 files
별도의 인수로 처리되며 파일 이름의 공백은 올바르게 처리됩니다.
따라서 본질적으로 스니핏은 파일 목록을 찾아서 수집하여 tar 명령에 별도의 인수로 전달합니다.
답변2
생성됨files=(...)
대량으로파일 이름 수
구문은 "${files[@]}"
배열의 _각 요소, 즉 발견된 각 파일 이름을 의미합니다. "..."
래핑에 유의하세요 . 일부 파일 이름이 분할되는 것을 방지하는 것이 중요합니다.
(파일 이름에 캐리지 리턴 문자가 포함되어 있으면 실패할 수 있습니다).
답변3
files=(...)
만들다대량으로이 구문을 만든 문자열 ksh
과 나중에 이를 채택한 쉘 등 bash
.
$(find /var/cdrs -maxdepth 1 -name \*.C*R -mtime +150)
지정된 기준과 일치하는 공백으로 구분된 경로 이름 목록을 만듭니다. 그러나 파일 이름에 IFS 문자(일반적으로 공백, 탭 및 줄 바꿈) 중 하나가 포함되어 있으면 파일 이름이 여러 부분으로 분할되어 배열에 잘못 저장됩니다.
"${files[@]}"
각 요소가 참조되는 문자열 목록으로 확장됩니다. 이전 단락에서 설명한 대로 배열에는 공백, 탭 또는 캐리지 리턴이 포함될 수 없으므로 여기서 요소를 참조하는 것은 소용이 없습니다. 그러면 이 구문을 약간 단순화할 수 있습니다 ${files[*]}
.