我是shell脚本的新手,我有这个脚本:
#!/bin/bash
path_file_conf=/fullpath/directory/*.conf
if [ -e "$path_file_conf" ];then
echo "Found file"
else
echo "No found file"
fi
即使我在/ fullpath / directory /文件夹中有.conf文件,结果总是“找不到文件”。
我可以知道代码的哪一部分是错的吗? 提前谢谢!
答案 0 :(得分:2)
表达式:
path_file_conf=/fullpath/directory/*.conf
可能有多个匹配的路径名。因此$path_file_conf
的价值可能会最终成为,例如:
/fullpath/directory/foo1.conf /fullpath/directory/foo2.conf
条件:
if [ -e "$path_file_conf" ]; then
检查是否存在单个文件。如果“/fullpath/directory/foo1.conf /fullpath/directory/foo2.conf”没有命名“单个文件”,它不会命名,那么即使文件存在,条件也会失败。
你可以这样检查。如果路径没有扩展,它将失败并退出。如果它找到至少一个好路径,它将成功并退出。
for pf in $path_file_conf ; do
if [ -e "$pf" ] ; then
echo "Found"
break
else
echo "Not found"
fi
done
答案 1 :(得分:2)
我会尝试这样的事情:
for filename in /fullpath/directory/*.conf
do
if [ -e "$filename" ] # If finds match...
then
echo "Found file"
echo
else
echo "No found file"
fi
done
我没有测试过,所以我不确定它是否有效,但它至少会给你整体策略。
答案 2 :(得分:1)
造成麻烦的一行是:
path_file_conf=/full/path/directory/*.conf
当有多个文件要匹配时,或者当没有文件匹配时,shell不会对名称进行通配符扩展(所以(在具有带星号的文件名为*.conf
的异常情况下除外) -e
测试失败。 {> 1}}中可能存在一个选项,当通配符无法匹配时会生成错误;我永远不会用它。
您可以使用:
bash
这将为您提供一个数组,其中包含文件的名称作为数组的元素。但是,如果没有匹配的文件,它会为您提供编写为数组唯一元素的名称。
从那里,您可以依次检查每个文件:
path_file_conf=( /full/path/directory/*.conf )
您可以使用for conf_file in "${path_file_conf[@]}"
do
if [ -e "$conf_file" ]
then echo "Found file $conf_file"
else echo "No such file as $conf_file"
fi
done
确定名称的数量,但请记住,1可能表示实际文件或不存在的文件。