我想检查输入字符串是否引用文件名 -不是通配符字符串,例如*.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
扩展名的常规文件,则需要循环或 usefind
或zsh
glob 限定符。
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