因此,我已经知道如何检查特定文件的存在:
if [ -f ~/file1 ]; then echo "is there" ; else echo "not there" ; fi
if [ -f ~/file2 ]; then echo "is there" ; else echo "not there" ; fi另外,对于两个文件的存在:
[[ -f file1 && -f file2 ]] && echo "both" || echo "not"然而,我不知道的是如何知道两个不同文件的存在,同时也打印它们各自的名称(如果其中任何一个存在,如果两者都存在,或者如果它们都不存在,则打印一个错误.)
因此:
发布于 2021-02-05 22:44:21
我会在一个循环中这样做:
for pathname in ~/file1 ~/file2; do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
else
printf '"%s" does not exist\n' "$pathname"
fi
done这基本上是对循环头中提到的每个路径名的存在性进行单一测试,并根据测试结果来决定输出内容。输出提到所检查的路径名和测试结果。
如果路径名匹配一个简单的模式,那么这可以在循环中使用:
for pathname in ~/file[12]; do ...; done这个问题也可以解释为:打印每个现有路径名,但如果不存在任何文件,则打印所有路径名,并注明它们不存在。
set -- ~/file1 ~/file2
found=false
for pathname do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
found=true
fi
done
if ! "$found"; then
printf '"%s" does not exist\n' "$@"
fi我在这里使用位置参数列表作为列表,保存我们想要检查的路径名。我这样做是因为我们可能希望循环这个列表两次;一次是使用我们的-e测试,然后在调用printf时(隐式地),如果发现没有文件存在的话。
代之以在bash中使用数组(需要更多地输入):
files=( ~/file1 ~/file2 )
found=false
for pathname in "${files[@]}"; do
if [ -e "$pathname" ]; then
printf '"%s" exists\n' "$pathname"
found=true
fi
done
if ! "$found"; then
printf '"%s" does not exist\n' "${files[@]}"
fi请注意,files=( ~/file1 ~/file2 )也可以编写
files[0]=~/file1
files[1]=~/file2只是关于-f测试和-e测试的评论。-e测试测试是否存在,而-f测试测试是否存在和文件类型。如果路径名不引用常规文件(或普通文件的符号链接),则-f测试可能为假,而-e测试则可能为真。“常规文件”是指不是目录、套接字、命名管道或任何其他常见Unix文件类型的文件。
在我的回答中,我选择了-e测试,而不是-f测试,因为您在问题中反复使用了“存在”一词,而没有提到任何关于文件类型的内容。
https://unix.stackexchange.com/questions/632909
复制相似问题