我是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"
答案 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