Jeg har et bash-skript med følgende:
#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi
Dette skriptet vil ikke løp uten -e. Hva gjør -e
for dette skriptet? Hva gjør $?
også i denne sammenheng?
Kommentarer
Svar
Innlegget ditt inneholder faktisk to spørsmål.
-
-e
-flagget instruerer skriptet om å avslutte ved feil. Flere flaggHvis det er en feil, vil den gå ut med en gang.
-
$?
er utgangsstatus for den siste kommandoen. I Linux betyr en utgangsstatus på0
at kommandoen var vellykket. Enhver annen status vil bety at det oppstod en feil.
Slik bruker du svarene på skriptet ditt:
egrep "^username" /etc/passwd >/dev/null
vil se etter username
i /etc/passwd
-filen.
-
Hvis den finner den da vil utgangsstatusen
$?
være lik0
. -
Hvis den ikke «t finner det at utgangsstatusen vil være noe annet (ikke
0
). Her vil du utføreecho "doesn"t exist"
delen av kode.
Dessverre er det en feil i skriptet ditt, og du vil utføre den koden hvis brukeren eksisterer – endre linjen til
if [ $? -ne 0 ]
for å få logikken riktig.
Imidlertid hvis brukeren ikke «t eksisterer, egrep
vil returnere en feil c ode, og på grunn av -e
alternativet, vil skallet umiddelbart gå ut etter den linjen, slik at du aldri kommer til den delen av koden.
Kommentarer
- I tillegg kan du få skriptet til å fungere riktig uten -e ved å erstatte de to første linjene med
if egrep "^username" /etc/passwd >/dev/null
. - Hvorfor kreves ingen
set
skjønt? : – / - @pst: Fordi
-e
er gitt til bash som et kommandolinjeargument. Alle alternativene oppført underset
godtas også av bash i kommandolinjen – merk den første setningen i seksjonen Alternativer i håndboken side.
Svar
Alle bash-kommandolinjebryterne er dokumentert i 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.
Kommentarer
- Ahh. Jeg så etter det hos mannen, men etter å ha funnet -e i filtestene og nei -e under hovedargumentene ga jeg opp. Fint utdrag. Hvorfor kreves ingen
set
? : – /
Svar
Skriptet ditt er feil, fordi
egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi
exit status 0 – mener – alt er OK, i tilfelle grep betyr» OK, fant strengen «. exit status! = 0 betyr at noe er galt, i tilfelle grep 1 betyr «ikke funnet», 2 betyr «kan ikke åpne inngang» …
-e
på mannssiden (jeg vil virkelig se et svar adressere dette).$?
inneholder den siste utgangskoden (den foregrep
-prosessen som er skapt ovenfor).-e
er dokumentert underset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
og[
. Dette skriptet vant ' t med-e
, for hvisgrep
finner ' ikke noe, så under-e
skriptet avsluttes akkurat der. Uten-e
har du ' fått meldingen bakover: en status ($?
) av 0 betyr at grep fant brukeren. Merk at dette forresten skal være `grep ' ^ brukernavn: ' (hva om det ' er en annen bruker med et lengre navn?).#/bin/bash -e
ha samme effekt som#/bin/bash
på linje nr. 1 ogset -e
på linje nr. 2?