Bash |脚本不适用于所有目录。为什么?

Bash | Script does not work in all directories. Why?

以下脚本首先尝试以正常方式停止 tomcat(存储在数组中)。 10秒后Tomcat仍未停止,将被强制杀死。

脚本工作正常,但只在创建它的目录中。如果我将它复制到另一个文件夹,则它无法正常工作。

#!/bin/bash
            array=(
                    "service1-tomcat"
                    "service2-tomcat"
                    "service3-tomcat"
                    "service4-tomcat"
                    "service5-tomcat"
                    )    
            #Stopping
            if [ ! $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then    
                    echo "STOP Tomcats"
                    for i in "${array[@]}"
                    do
                            /data/tomcats/$i/bin/shutdown.sh &> /tmp/output.txt
                    done
                    echo " done"    
            fi
            sleep 10
        
           #Killing
           if [ ! $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
            
                    echo "KILL $(ps aux | grep [t]omcat/ | wc -l) dogged Tomcats"
                    for i in "${array[@]}"
                            do
                                    if [ ! $(ps aux | grep $i | wc -l) -eq 0 ];then
                                            echo "$i"
                                    fi
                            done
            
                    kill -9 $(ps aux | grep [t]omcat | awk '{print }')
                    if [ $(ps aux | grep [t]omcat/ | wc -l) -eq 0 ];then
                             echo "done"
                    fi
            fi

脚本创建于 /var/data/tomcats: 如果在此处执行脚本,则会出现以下内容,这完全符合预期。

STOP Tomcats. 
 Done.
 KILL 1 dogged Tomcats
 service1-tomcat
 Done

然而,当我在 /var/data 或 /tmp 或其他目录中 运行 时,它不会列出需要被杀死的 tomcat,而是一般的 ALL。输出如下所示:

STOP Tomcats. 
Done.
KILL 1 dogged Tomcats
service1-tomcat
service2-tomcat
service3-tomcat
service4-tomcat
service5-tomcat
Done

我无法解释为什么脚本只能在一个文件夹中正常运行。没有相对路径等

我做错了什么?

grep [t]omcat -- 因为该模式未被引用,所以 shell 会将其视为 shell glob 模式。如果当前目录中有一个名为 tomcat 的文件,grep 将得到一个普通的“tomcat”正则表达式模式而不是带有方括号的那个,然后 ps | grep 管道可能 return 结果太多。

如果您要将模式发送到外部命令(grep 或 tr 是特别常见的违规者),请引用该模式。


您可能会喜欢 pgrep 而不是 ps | grep