Váš příspěvek ve skutečnosti obsahuje 2 otázky.
-
-e
příznak dává skriptu pokyn k ukončení při chybě. Další příznakyPokud dojde k chybě, okamžitě se ukončí.
-
$?
je výstupní stav posledního příkazu. V Linuxu stav ukončení0
znamená, že příkaz byl úspěšný. Jakýkoli jiný stav by znamenal, že došlo k chybě.
Chcete-li použít tyto odpovědi na svůj skript:
egrep "^username" /etc/passwd >/dev/null
by hledal username
v /etc/passwd
soubor.
-
Pokud jej nalezne, pak stav ukončení
$?
bude rovno0
. -
Pokud jej nenajde, bude stav ukončení jiný (ne
0
). Zde budete chtít spustitecho "doesn't exist"
část kódu.
Bohužel ve vašem skriptu je chyba a tento kód byste provedli pokud uživatel existuje - změňte řádek na
if [ $? -ne 0 ]
abyste pochopili správnou logiku.
Nicméně pokud uživatel neexistuje, egrep
vrátí kód chyby a kvůli -e
shell se po tomto řádku okamžitě ukončí, takže byste se k této části kódu nikdy nedostali.
Všechny přepínače příkazového řádku bash jsou popsány v man bash
.
-e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command's return value is being inverted with !. A trap on ERR, if set, is executed before the shell exits. This option applies to the shell environment and each subshell envi- ronment separately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in the subshell.