我目前有这个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,反之亦然.