파일이 존재하는지 확인하려고 합니다. 예상대로 작동합니다.
if [ -e "/tmp/test.*.lock" ]; then
echo "exists!"
fi
다음은 수행되지 않습니다.
if [[ -e /tmp/test.*.lock ]]; then
echo "exists!"
fi
파일 이름은 /tmp/test.123.lock과 같을 수 있습니다.
"[[" 버전에서 작동하게 하는 방법을 찾을 수 없습니다. 누군가 이유와 작동 방법을 설명할 수 있습니까?
답변1
[[
사용자 제노이드가 맞습니다. 표현식에서는 경로 이름 확장이 발생하지 않습니다.
Bash 매뉴얼 페이지에서:
[[ expression ]]
조건식의 평가에 따라 0 또는 1의 상태를 반환합니다. 표현은 아래에 설명된 기본 색상으로 구성됩니다CONDITIONAL EXPRESSIONS
.[[
및 사이의 단어에 대해 토큰화 및 경로 이름 확장을 수행 하지 마십시오 .]]
;물결표 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체, 프로세스 대체 및 따옴표 제거를 수행합니다. 이와 같은 조건부 연산자를-f
기본 연산자로 인식하려면 따옴표를 풀어야 합니다.
(강조는 내 것)
테스트를 사용하려면 [[
실제 테스트 전에 확장이 이루어져야 합니다. 이는 생성된 파일 이름을 저장하는 배열을 사용하여 수행할 수 있습니다.
다음은 두 가지 예입니다. 첫 번째는 일치하는 파일을 테스트하고, 두 번째는 적어도 하나의 일치하는 파일을 테스트하고, 일치하는 파일이 발견되면 루프를 종료합니다.
files=( /tmp/test.*.lock )
# test if exactly one file matches
if [[ "${#files[@]}" -eq 1 ]] && [[ -e "${files[0]}" ]]; then
echo "file ${files[0]} exists!"
fi
# test if at least one file matches
for f in "${files[@]}"; do
if [[ -e "$f" ]]; then
echo "at least one file exists!"
break
fi
done
표현식의 변수 주위에 따옴표가 필요하지 않지만 [[
그렇게 해도 문제가 되지 않으며 [[
로 대체할 수 있습니다 [
. 잠금 파일이 일반 파일인 경우 대신 -f
.
답변2
[
는 명령(실제로 및 같은 다른 명령과 /usr/bin/[
마찬가지로 최적화된 쉘 내장 )이므로 그 뒤에 오는 모든 항목은 다른 명령과 마찬가지로 파일 이름 확장을 거칩니다.echo
printf
[[
bash 키워드입니다. 괄호 내에서는 파일 확장이 수행되지 않는 것 같습니다(그러나 bash 참조 매뉴얼에서는 이에 대한 정보를 찾을 수 없습니다).