如何检查bash中是否存在文件或文件目录?

前端之家收集整理的这篇文章主要介绍了如何检查bash中是否存在文件或文件目录?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前有这个bash脚本(位于我的主目录,即/ home / fusion809 /,我以root身份运行它,因为它是图标复制行所必需的):
cd /home/fusion809/Pictures/Icon*

declare -a A={Arch,Debian,Fedora,Mageia,Manjaro,OpenSUSE}
declare -a B={Adwaita,Faenza,gnome,Humanity}

for i in $A; do
  for j in $B; do
    if test -e /usr/share/icons/$j/scalable ; else
        mkdir /usr/share/icons/$j/scalable/
    fi
    if test -e /usr/share/icons/$j/scalable/$i.svg ; else
      cp -a $i*.svg /usr/share/icons/$j/scalable/$i.svg
    fi
  done
done

我希望这个脚本做的是将图标/图标和徽标目录中的图标复制到/usr/share / icons中的可缩放主题(在$B中指定)子目录.然而,在它执行此操作之前,我希望它在这些主题子目录中创建可伸缩目录(如果它尚不存在).问题是条件的else部分没有被正确读取,因为我一直收到这个错误

./copyicon.sh: line 8: Syntax error near unexpected token `else'
./copyicon.sh: line 8: `    if test -e /usr/share/icons/$j/scalable ; else'

如果你想知道为什么测试-e …在条件中它是基于关于bash脚本的教科书我一直在关注.

检查文件和/或目录是否存在

要检查bash中是否存在文件,请使用-f运算符.对于目录,请使用-d.用法示例:

$mkdir dir
$[ -d dir ] && echo exists!
exists!
$rmdir dir
$[ -d dir ] && echo exists!
$touch file
$[ -f file ] || echo "doesn't exist..."
$rm file
$[ -f file ] || echo "doesn't exist..."
doesn't exist...

有关更多信息,请执行man test.

关于-e的注释,此测试操作符检查文件是否存在.虽然这似乎是一个不错的选择,但最好使用-f,如果文件不是常规文件,则返回false. / dev / null例如是一个文件,但也不是常规文件.在这种情况下,检查返回true是不希望的.

关于变量的说明

一定要引用变量,一旦变量中包含空格或任何其他特殊字符,它就会产生不良副作用.因此,当您测试文件和目录是否存在时,请将文件/目录用双引号括起来.像[-f“/ path / to / some / ${dir} /”]这样的东西可以工作,如果dir中有空格,则以下内容会失败:[ – f / path / to / some / ${dir} / ].

修复语法错误

您在控制语句中遇到语法错误. bash if子句的结构如下:

if ...; then
    ...
fi

或者使用else子句可选:

if ...; then
    ...
else
    ...
fi

你不能省略then子句.如果您只想使用else子句,则应该否定该条件.导致以下代码

if [ ! -f "/usr/share/icons/$j/scalable" ]; then
    mkdir "/usr/share/icons/$j/scalable/"
fi

在这里,我们添加一个感叹号(!)来翻转表达式的评估.如果表达式的计算结果为true,则前面加上相同的表达式!将返回false,反之亦然.

猜你在找的Bash相关文章