我想编写一个接受进程名称的脚本(我每次都会询问用户进程名称,然后在同一行上提示),如果进程存在,它将打印“存在”或者如果没有“不存在”取决于系统上当前是否存在这样的进程。
例子:
Enter the name of process: bash
exists
Enter the name of process: bluesky
does not exist
我的代码:
#!/bin/bash
while true
do
read -p "Enter the name of process: "
if [ pidof -x > 0 ]; then
echo "exists"
else
echo "does not exist"
fi
done
我收到的错误消息。
pidof: unary operator expected
答案1
这里有几件事需要纠正。
首先,虽然你通过 请求用户输入read
,但你实际上并没有在任何地方使用结果。默认情况下,read
将读取的内容分配给名为的变量,REPLY
因此你会想要pidof -x "$REPLY"
其次,在[ ... ]
POSIX 测试括号内,>
具有其作为重定向运算符1 的普通含义。如果您检查当前目录,您可能会看到它现在包含一个名为 的文件0
。整数“大于”测试是-gt
。
第三,测试pidof -x
内部[ ... ]
只是一个字符串;将其作为命令执行并捕获所需的结果命令替换
[ "$(pidof -x "$REPLY")" -gt 0 ]
但是,pidof
如果找到多个匹配的进程,可能会返回多个整数 - 这将导致另一个错误。因此我建议改为使用退出状态直接pidof
:
EXIT STATUS
0 At least one program was found with the requested name.
1 No program was found with the requested name.
所以你可以
#!/bin/bash
while true
do
read -p "Enter the name of process: "
if pidof -qx "$REPLY"; then
echo "exists"
else
echo "does not exist"
fi
done
1在 bash 中[[ ... ]]
延伸测试,>
是一个比较运算符 - 但是它执行的是字典顺序比较而不是数字比较,所以你仍然需要-gt
它。你可以但是用于>
算术结构内部的整数比较(( ... ))
。
答案2
这是错误的测试。我的意思是,你问的是(好吧,你想问,但语法有问题)“PID 是否大于 0”,而你应该问的是“至少有一个 PID 吗”。你可以使用pidof -q
它来检查是否存在:
$ pidof -q bash && echo "exists" || echo "does not exist"
exists
$ pidof -q randomthing && echo "exists" || echo "does not exist"
does not exist
您的脚本存在很多问题。首先,当您使用read
不带变量的脚本时,值存储在特殊变量中$REPLY
,但您并未使用它。相反,您运行的脚本pidox -x
没有参数,因此始终不会返回任何内容。您想要的是类似这样的脚本:
read -p "Enter the name of process: "
if pidof -x "$REPLY"; then ...
但无论如何,在启动脚本后,请避免要求用户输入。这只意味着您的脚本无法自动化,用户可能会输入错误的值,整个过程将变得更难使用,而且没有任何好处。相反,请将进程名称作为参数读取。
把所有这些放在一起,你会得到如下结果:
#!/bin/bash
if pidof -qx "$1"; then
echo "There is at least one running process named '$1'"
else
echo "There are no running processes named '$1'."
fi
像这样运行:
script.sh processName
例如:
script.sh bash