와일드카드 없이 쉘 변수 확장

와일드카드 없이 쉘 변수 확장

입력 문자열이 파일 이름을 참조하는지 확인하고 싶습니다.아니요와일드카드 문자열 *.txt(예:

이것은 작동하지 않습니다:

if [ -f "$1" ];

$1로 확장되면 *.txt으로 확장되기 때문에 foo.txt bar.txt으로 전달됩니다 test -f.

와일드카드를 명시적으로 확인하는 것 외에 쉘 대체를 수행하고 와일드카드를 방지하는 일반적인 방법이 있습니까?

답변1

아니요, 글로브는아니요견적을 확장하면 다음과 같습니다.

set -- '*.txt'
[ -f "$1" ]

현재 디렉토리에서 호출된 파일이 *.txt일반 파일인지 일반 파일에 대한 심볼릭 링크인지 확인합니다.

[ -f $1 ]

이것은 문제가 될 것입니다( $1단어 분할(여기서는 기본값으로 아무것도 하지 않음 $IFS) 및 파일 이름 생성을 수행합니다).

확장자를 가진 일반 파일이 존재하는지 확인하려면 .txt루프나 사용 find또는 zshglob 한정자가 필요합니다.

set -- *.txt
for f do
  if [ -f "$f" ]; then
    echo "there is at least one regular file with a .txt extension here"
  fi
done

또는 패턴이 다음에서 발견된 경우 $1:

IFS= # disable the splitting part of the split+glob operator
set -- $1
for f do... # as above

zsh:

files=(*.txt(N-.))
echo "$#files regular files with a .txt extension here"

find:

find -L . ! -name . -prune ! -name '.*' -name '*.txt' -type f | grep -q . &&
  echo there are regular .txt files in here

관련 정보