如何在for循环中忽略文件

如何在for循环中忽略文件

我正在制作一个脚本来在服务器重新启动时启动许多服务。为此,我循环遍历目录,检查每个目录是否都有 start.sh 脚本,如果有,则调用该脚本。但是,作为其中的一部分,我想设置脚本来忽略它具有选择名称的服务,在本例中为 mongo:

for service in $HOME/start/* ; do
    if [ -e $HOME/start/$service/start.sh ] && [ $service != mongo ]
        then
            cd $HOME/start/$service
            ./start.sh
    else
        pwd
        echo "No start script found for $service"
    fi
done

这是因为 mongo 在调用此循环之前启动,作为服务的前提条件,并且您一次不能拥有多个它的实例。然而,它继续循环并调用 mongo。我怎样才能让它忽略这一点?

编辑:更正 appName 为 service

答案1

当您使用 glob 迭代文件时,路径将被添加到文件中。因此,如果您的文件只是mongo(它应该基于您的代码,如果不是,那也是一个问题),您的循环将设置service/home/<YOUR USER>/start/mongo.然后你试图看看它是否不等于mongo它不等于。您可以使用以下方法basename来修复该问题:

for s in "$HOME/start/"*
do
    service=$(basename "$s")
    if [ -f "$HOME/test/$service/start.sh" ] && [ "$service" != mongo ]
    then
            cd "$HOME/start/$service"
            ./start.sh
    else
            pwd
            echo "No start script found for $service"
    fi
done

答案2

对于“扩展通配/扩展模式匹配”可能是一个有趣的案例 - 如果您的 shell ( bash?) 提供了:

$ shopt -s extglob
$ for s in "$HOME/start/"!(mongo); do echo $s; done

答案3

不要这样做!使用该机器在您的发行版中启动服务(大概systemd是今天的 Linux;其他 Unixy 系统有自己可爱的怪癖......)。然后使用发行版的机制来启用/禁用服务启动。

您的发行版文档应该提供详细信息。如果您从发行版的软件包安装该服务,这应该会自动处理。那就是非常高度建议:发行版(实际上:其中包的维护者)将确保安装正确完成,安全配置,并密切关注错误报告(以及潜在的安全风险,如果是某种类型的问题,则需要考虑这一点)服务器,暴露于来自世界各地的各种恶棍)。

相关内容