场景:
开发A在windows环境下完成了开发,配置管理员cm搭建jenkins在centos环境下编译,cm编译失败,但是开发A在他的windows环境下可以编译过,最后发现是某几个so文件的软链接方式不一样导致的,在linux上编译,需要重新使用ln -s 来设置软链接,此处,我们不关注windows是如何设置软链接的。
此时比如/root/third/目录下有文件:
libffpeg.so
libffpeg.so.12.11
其中libffpeg.so是软链接,软链接的原始文件是libffpeg.so.12.11,如果直接执行ln -s libffpeg.so.12.11 libffpeg.so 会直接报错libffpeg.so已经存在,必须删除以后才能执行成功,此时,shell脚本,我们会这样写:
#!/bin/sh
if [ -f libffpeg.so ] ; then
rm libffpeg.so
ln -s libffpeg.so.12.11 libffpeg.so
fi
你会发现这个if完全没有执行,我们用的是 “ -f ”参数来判断这个软链接文件是否存在,那么软链接文件是不是一个文件呢,其实软链接文件不能说是一个文件,只能算一种符号链接,所以使用“-f ” 来判断文件是不行的,应该使用 “ -L”来判断指定的是否为符号链接,正确的写法如下:
#!/bin/sh
if [ -L libffpeg.so ] ; then
rm libffpeg.so
ln -s libffpeg.so.12.11 libffpeg.so
fi
结果显示如下:
参考 if的条件判断如下:
-d :判断指定的是否为目录
-z:判断指定的变量是否存在值
-f:判断指定的是否为文件
-L:判断指定的是否为符号链接
-r:判断指定的是否可读
-w:判断指定的是否可写
-x:判断存在的对象是否可以执行
!:测试条件的否定符号