扩展 shell 变量而不进行通配

扩展 shell 变量而不进行通配

我想检查输入字符串是否引用文件名 -不是通配符字符串,例如*.txt.

这不起作用:

if [ -f "$1" ];

因为$1被扩展到*.txt,它被扩展到,比如说foo.txt bar.txt,它被传递到test -f

除了显式检查通配符之外,是否有一种通用方法可以执行 shell 替换,然后防止任何通配符?

答案1

不,glob 是不是引用时展开,因此:

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

将检查当前目录中调用的文件是否*.txt是常规文件或常规文件的符号链接。

[ -f $1 ]

这将是一个问题($1将进行分词(此处不使用默认值执行任何操作$IFS)和文件名生成)。

如果您想检查是否存在带有.txt扩展名的常规文件,则需要循环或 usefindzshglob 限定符。

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

相关内容