Bash: 와일드카드 및 파일 조건

Bash: 와일드카드 및 파일 조건

파일이 존재하는지 확인하려고 합니다. 예상대로 작동합니다.

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/[마찬가지로 최적화된 쉘 내장 )이므로 그 뒤에 오는 모든 항목은 다른 명령과 마찬가지로 파일 이름 확장을 거칩니다.echoprintf

[[bash 키워드입니다. 괄호 내에서는 파일 확장이 수행되지 않는 것 같습니다(그러나 bash 참조 매뉴얼에서는 이에 대한 정보를 찾을 수 없습니다).

관련 정보