退出在 shell 脚本中不起作用

pla*_*tio 5 shell-script

在shell脚本中,如果数据库离线,我有以下代码可以提前退出;

Br3trans -u / -c -f dbstate && ( echo Datenbank ist online. ; echo Nächster Schritt... ) || ( echo "Datenbank ist offline" ; exit 1 );
echo Test
Run Code Online (Sandbox Code Playgroud)

如果数据库脱机,它不会退出脚本,而是转而回显“测试”。

有任何想法吗?

roa*_*ima 17

exit语句退出子shell。

如果您展开单衬纸,它将开始按您的预期工作

#!/bin/bash
if Br3trans -u / -c -f dbstate
then
    echo "Datenbank ist online."
    echo "Nächster Schritt..."
else
    echo "Datenbank ist offline"
    exit 1
fi
echo Test
Run Code Online (Sandbox Code Playgroud)

或者,在某些 shell 中,您可以使用 grouping{...}而不是 subshel​​l (...),但我认为为了可读性,最好使用我给您的稍长的版本。

  • 您可能错过了双引号 (`"`) 或 `if`...`then`...`else`...`fi` 结构的一部分。尝试将您的代码复制到 https:/ /shellcheck.net/ 看看它告诉你什么。 (6认同)
  • 如果 shell 抱怨超出脚本末尾的行,则意味着它在期望某些语法元素时超出了文件的末尾。通常:任何类型的不平衡引号或括号:' " ` { } ( ) [ ] [[ ]]。或者 do-done、if/then/else/fi 等等。 (6认同)

Adm*_*Bee 9

我认为你的问题是你有exit一个( ... )-enclosed 组中的命令,它将在专门为该命令组创建的子 shell 中执行所有命令。因此,您的exit语句仅适用于子 shell,而不适用于用于运行脚本的主 shell。

在这种情况下,我会推荐显式测试命令而不是“单行”方法:

#!/bin/bash

if Br3trans -u / -c -f dbstate
then
   echo "Datenbank ist online"
   echo "Nächster Schritt ..."
else
   echo "Datenbank ist offline"
   exit 1
fi
echo "Test"
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您仍然可以将其写为单行:

if Br3trans -u / -c -f dbstate; then echo "Datenbank ist online"; echo "Nächster Schritt"; else echo "Datenbank ist offline"; exit 1; fi
echo "Test"
Run Code Online (Sandbox Code Playgroud)