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å0at 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
setskjønt? : – / - @pst: Fordi
-eer gitt til bash som et kommandolinjeargument. Alle alternativene oppført undersetgodtas 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» …
-epå mannssiden (jeg vil virkelig se et svar adressere dette).$?inneholder den siste utgangskoden (den foregrep-prosessen som er skapt ovenfor).-eer dokumentert underset.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fiifog[. Dette skriptet vant ' t med-e, for hvisgrepfinner ' ikke noe, så under-eskriptet avsluttes akkurat der. Uten-ehar 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 -eha samme effekt som#/bin/bashpå linje nr. 1 ogset -epå linje nr. 2?