![使用 -f 检查文件是否存在并将结果转换为变量](https://linux22.com/image/920769/%E4%BD%BF%E7%94%A8%20-f%20%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E5%B9%B6%E5%B0%86%E7%BB%93%E6%9E%9C%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%8F%98%E9%87%8F.png)
尝试使以下命令查找完整的精细名称正常工作,但目前还不能。
我用来查找文件“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