使用 -f 检查文件是否存在并将结果转换为变量

使用 -f 检查文件是否存在并将结果转换为变量

尝试使以下命令查找完整的精细名称正常工作,但目前还不能。

我用来查找文件“Lista*”的命令:


PathFileIN_Elab=/root/Testms/Files

ChkFileName="$(ls -1 -f $PathFileIN_Elab/"$line"* |xargs basename)"
[ -f "${ChkFileName}" ] && echo "File exist"; echo  "Err: $?"; NomeFil="${ChkFileName}" || echo "File does not exist"; echo "Err: $?"
echo ValNomeFileFullExt: "${ChkFileName}"

当文件“Lista*”存在时的结果:


错误:1

错误:0

ValNomeFileFullExt: Lista.txt


++ 我没有看到文件存在或不存在的任何回显,但两种情况的返回代码都是“err”...为什么?

当文件“Lista*”不存在时的结果:


ls:无法访问 /root/Testms/Files/Lista*:没有这样的文件或目录 basename:缺少操作数

使用“basename --help”获取更多信息。

错误:1

错误:0

ValNomeFileFullExt:


++ 没有回显文件是否存在 + 返回代码与之前相同,加上基本名称消息

我想要做的是仔细检查文件名(是否存在扩展名)并将其设置为检查后需要的变量,因此:

a)如果文件存在,我会用全名设置变量:NomeFil="${ChkFileName}"

b)如果文件不存在,我想运行一个命令(现在在测试中它只是一个回声)。

有人能帮帮我吗?我是 Bash 脚本的新手。

提前致谢。

答案1

当使用匹配时,您可以期望返回零个或多个答案,因此最好使用循环for一次测试一个对象,否则它会破坏您的-f测试语句。

#!/bin/bash

shopt -s nullglob

a="Lista*"
b="/root/Testms/Files/$a"

for c in $b; do
   [[ -f $c ]] && { d=1; break; }
done
[[ $d ]] && { echo File exists; \
              echo ValNomeFileFullExt: $(basename "$c"); } || \
              echo File does not exists

相关内容