Shell 判断文件/目录是否存在/可执行等
今天在写我的 Ubuntu Server Setup Tool 时,因为在本地的环境下面 php5-fpm 默认监听 *127.0.0.1*,但是在我的 Linode VPS 上面,安装之后却默认监听 *unix:/var/run/php5-fpm.sock*,应该是版本不同的原因吧,所以我需要有一种办法,让程序知道是应该使用哪种监听方式(我们需要把这个写进 Nginx 的配置文件的),这个时候就用到我现在要说的这些东西了。
先来解决我的问题:我应该使用哪种监听方式?
因为,如果是以 Unix Socket 的方式监听的话,那肯定是需要有一个 Socket 文件的,而以IP+端口的方式却没有,所以,我现在可以把问题简单的转化为,是否存在一个相关的 Socket 文件,对于我现在要解决的这个问题,其实就是:是否存在 /var/run/php5-fpm.sock 文件,这样一来问题自然而然的就已经解决了:
#!/bin/bash
LISTEN_METHOD="127.0.0.1:9000"
if [ -S /var/run/php5-fpm.sock ]; then
LISTEN_METHOD="unix:/var/run/php5-fpm.sock"
fi
echo $LISTEN_METHOD执行包含上面这段代码的可执行文件,就可以知道是哪一直方式了(这个只是 apt-get 安装之后默认配置的位置,如果你修改了php5-fpm 的 Socket 文件的路径,那么这个需要修改一下下(不过如果你都知道修改了,那么我想你也应该知道使用哪种方式了吧,只是对于我的自动安装脚本来说,还是要自动选择比较好,就像上面这样的。
判断文件是否存在
要判断一个文件是否存在其实是很简单的一件事情,只需要像下面这样:
if [ ! -f /path/to/file ]; then
touch /path/to/file
fi在上面的示例中,会先判断 /path/to/file* 这个文件是否存在,如果不存在,则创建它,这里我们使用了“非”,即“!*”符号,如果去掉这个符号,那么就是“如果文件存在就怎么样”。
在上面的判断语句中 *-f* 是一个参数,它表示“文件存在,并且是一个普通文件”,与该参数具有同样功能的还有很多其它参数,但是不管参数蛤才能,后面部分都是你想判断的文件的路径。
与文件判断相关的参数
下面这些参数都是我们可能在 Shell 脚本中使用得到的:
参数|意义 -|- -a|文件存在 -b|文件存在并且是一个特殊的块文件 -c|文件存在并且是一个特殊字符文件 -d|文件存在并且是一个目录 -e|文件存在(与 -a 是一样的) -f|文件存在并且是一个普通文件 -g|文件存在,并且有setgid(2)设置 -G|文件存在,并且属于当前进程相同的组 -k|文件存在并且设置了sticky 标记 -L|文件存在,并且是一个动态链接 -O|文件存在,并且与当前进程属于相同的用户ID -p|文件存在,并且是先入先出(FIFO)的特殊文件或者命名管道 -r|文件存在,并且是当前进程可读取的 -s|文件存在,并且文件大小大于0 -S|文件存在,并且是一个Socket -t|文件描述符是对外开放的,并且关联一个终端设备 -u|文件存在,并且有 setuid(2) -w|文件存在,并且是当前进程可写的 -x|文件存在,并且是当前进程可执行的 -n|字符串长度不为0 -o|指定的选项已经设置 -z|字符串长度为0
上表中,-n*,-o,-z*是用来判断字符串或者选项的。
如果我们想直接在终端中判断而不使用 if 判断,那么我们还可以使用*test*命令,比如:
test -S /var/run/php5-fpm.sock上面这样并不会显示任何内容,但是我们可以这样:
root@li485-100:~# test -S /var/run/php5-fpm.sock && echo "exist" || echo "Not exist"
exist
root@li485-100:~# test -S /var/run/php5-fpm.socket && echo "exist" || echo "Not exist"
Not exist
评论已关闭