Shell脚本中“!-S”的含义

时间:2019-04-15 12:27:05

标签: shell

我是Shell脚本的新手,并且遇到了一个我不理解的脚本:

DOWN=true
while $DOWN; do
    sleep 0.1
    DOWN=false
    for i in {1..7}
    do
    if [ ! -S "qdata/c$i/tm.ipc" ]; then
            DOWN=true
    fi
    done
done

具体来说,此命令是什么意思:

! -S "qdata/c$i/tm.ipc"

2 个答案:

答案 0 :(得分:3)

您正在查看的命令实际上是这样的:

[ ! -S "qdata/c$i/tm.ipc" ]

尽管看起来像标点符号,[实际上是命令的名称,也称为test;所以命令也可以这样写:

test ! -S "qdata/c$i/tm.ipc"

在上下文中看起来像这样:

if test ! -S "qdata/c$i/tm.ipc"; then
        DOWN=true
fi

顾名思义,它的工作是测试字符串,数字或文件的某些属性,如果测试通过,则返回0(在shell脚本中代表真)。 ,如果不是,则为1(代表false)。

有了这些知识,您可以运行man test,并找到有关!-S参数的以下解释:

   ! EXPRESSION
         EXPRESSION is false

   -S FILE
         FILE exists and is a socket

因此test ! -S filename[ ! -S filename ]可以读作“不是等号的文件名”。

因此,该命令正在检查循环中是否存在带有每个名称的“套接字”(一种特殊类型的文件)。脚本使用此命令作为if语句的参数(可以接受任何命令,而不仅仅是[),并且如果其中任何一个执行,则将DOWN设置为true < em>不存在。

答案 1 :(得分:0)

您实际上并没有指定要谈论的shell,因为它们可能会有很大差异。

要回答您的问题,上下文是一个常见的构造

if [ <some test> ]
then
<commands>
fi

[ <some test>]是对the command test的呼叫

如果查看该命令的文档,您会发现!对结果求反,而-S检查True if file is a socket.

因此您可以将其读取为if "qdata/c$i/tm.ipc" is not a socket