Van egy bash szkriptem a következővel:
#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi
Ez a szkript nem fog fut az -e nélkül. Mit csinál a -e
ehhez a szkripthez? Ezenkívül mit csinál a $?
ebben a kontextusban?
Megjegyzések
egy másik, hosszabb névvel rendelkező felhasználó?).
#/bin/bash -e
ugyanaz a hatása lesz, mint #/bin/bash
az 1. sorban és set -e
a 2. sorban? Válasz
A bejegyzésed valójában 2 kérdést tartalmaz.
-
A
-e
jelző utasítja a szkriptet, hogy hiba esetén lépjen ki. További jelölőkHa hiba történik, akkor azonnal kilép.
-
A
$?
az utolsó parancs kilépési állapota. Linux alatt a0
kilépési állapot azt jelenti, hogy a parancs sikeres volt. Bármely más állapot hibát jelent.
Ezeknek a válaszoknak a szkriptjére történő alkalmazása:
egrep "^username" /etc/passwd >/dev/null
a username
fájlt keresi a /etc/passwd
fájlban.
-
Ha megtalálja akkor a
$?
kilépési állapot egyenlő lesz0
. -
Ha nem “Nem találom, hogy a kilépési állapot valami más lesz (nem
0
). Itt végre kell hajtani aecho "doesn"t exist"
részt kód.
Sajnos hiba van a szkriptben, és végrehajtaná ezt a kódot: , ha a felhasználó létezik – módosítsa a sort
if [ $? -ne 0 ]
a logika jobb megszerzése érdekében.
Ha azonban a felhasználó nem, “t létezik, egrep
egy c hibát ad vissza ode, és a -e
opció miatt a shell azonnal kilép a sor után, így soha nem érné el a kód azon részét.
Megjegyzések
- Ezenkívül a szkriptet az -e nélkül is megfelelően működtetheti, ha az első két sort lecseréli a
if egrep "^username" /etc/passwd >/dev/null
szóra. - Miért nincs szükség
set
-re? : – / - @pst: Mivel a
-e
parancssori argumentumként van megadva a bash-nak. Aset
alatt felsorolt összes beállítást a bash is elfogadja a parancssorában – vegye figyelembe a kézikönyv Opciók szakaszának első mondatát oldal.
Válasz
Az összes bash parancssori kapcsolót a 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.
Megjegyzések
- Ahh. Megkerestem a férfiban, de miután megtaláltam az -e fájlteszteket és a -e-t a főbb érvek alatt, feladtam. Szép részlet. Miért nem szükséges mégis
set
? : – /
Válasz
A szkripted helytelen, mert
egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi
exit status 0 – jelentése – minden rendben van, a grep esetében pedig azt jelenti, hogy” OK, megtalálta a karakterláncot “. exit status! = 0 azt jelenti, hogy valami nincs rendben, a grep esetén az 1. jelentése: “nem található”, a 2. jelentése: “nem lehet megnyitni a bemenetet” …
-e
a man oldalon (nagyon szeretném, ha egy válasz ezzel foglalkozna). A$?
tartalmazza az utolsó kilépési kódot (a fent keletkezettegrep
folyamat kódját).-e
aset
alatt van dokumentálva.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
és[
. Ez a szkript ' nem fog működni-e
vel, mert hagrep
nem talál ' nem talál semmit, akkor a-e
alatt a parancsfájl ott fog végződni.-e
nélkül ' visszakapta az üzenetet: egy állapot ($?
) A 0 azt jelenti, hogy a grep valóban megtalálta a felhasználót. Ne feledje, hogy ennek a következőnek kell lennie: grep ' ^ felhasználónév: ' (mi van, ha ott van