miten testaan ohjelman paluukoodin bash -skriptissä?
Yleensähän ohjelmat palauttavat 0 jos kaikki on ok, ja nollaa suuremman koknaisluvun, jos jotain meni pieleen.
Yritin itse googlettaa asiaa, ja ...
http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss10.4
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?
em. tavalla todellakin tulostuu 0 tai 1 näytölle.
Mutta entä tuon $?:n testaus if -lauseella, miten ???
Seuraava tulostaa vain 2 kertaa "1".
cd /dada &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi
#
cd $(pwd) &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "pwd ERR expression evaluated as 0 (false)"
fi
miten siis ?
Yleensähän ohjelmat palauttavat 0 jos kaikki on ok, ja nollaa suuremman koknaisluvun, jos jotain meni pieleen.
Yritin itse googlettaa asiaa, ja ...
http://www.faqs.org/docs/Linux-HOWTO/Bash-Prog-Intro-HOWTO.html#ss10.4
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?
em. tavalla todellakin tulostuu 0 tai 1 näytölle.
Mutta entä tuon $?:n testaus if -lauseella, miten ???
Seuraava tulostaa vain 2 kertaa "1".
cd /dada &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi
#
cd $(pwd) &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "pwd ERR expression evaluated as 0 (false)"
fi
miten siis ?
Vastaukset 5
Vanhimmat
en nyt todella tiedä mitä haluat saada aikaiseksi, mutta luultavasti tuo toimii vain bashilla, eikä sh:lla.
eli alkuun rivi
#!/bin/bash
tai suoritus
bash skripti eikä
sh skripti
menisikö kokonaisuudessaan:
----
#!/bin/bash
cd /dada &> /dev/null
vertaa=$?
echo rv: $vertaa
if [ "$vertaa" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi
#
#
cd $(pwd) &> /dev/null
vertaab=$?
echo rv: $vertaab
#
if [ "$vertaab" -eq 0 ]; then
echo "1"
else
echo "pwd ERR expression evaluated as 0 (false)"
fi
---
haluatko kertoa mitä olet tekemässä :)
> Seuraava tulostaa vain 2 kertaa "1" <
if [ "$?" -eq 0 ]; then
echo "1"
else
echo "dada ERR expression evaluated as 0 (false)"
fi
Noissa if-else testeissäsi pitäis nuo echot olla tasan päinvastaisessa järjestyksessä?
if [ "$?" -eq 0 ]; then
echo "OK: ed. komennon paluuarvo on $?"
else
echo "VIRHE: ed. komennon paluuarvo on $?"
fi
> miten testaan ohjelman paluukoodin bash -skriptissä? <
#!/bin/sh
# Edeltävän komennon paluuarvon testaus skriptissä muuttujan $? avulla
# Ekan komennon tulisi palauttaa arvon 0,
# olettaen, että käyttäjän kotihakemisto ~ on olemassa:
# (tuo ~ on vaan lyhenne /home/käyttäjätunnus)
cd ~ 2&>1 /dev/null
if [ "$?" -eq 0 ]; then
echo "OK: Eka komento palautti arvon $?"
else
echo "VIRHE: Eka komento palautti arvon $?"
fi
# Tokan komennon ei tulisi palauttaa arvoa 0,
# olettaen, että hakemistoa /foobar ei ole olemassa:
cd /foobar 2&>1 /dev/null
if [ "$?" -eq 0 ]; then
echo "OK: Toka komento palautti arvon $?"
else
echo "VIRHE: Toka komento palautti arvon $?"
fi
Ainoa ongelma alkuperäisessä koodissani oli se, että:
cd /dada &> /dev/null
echo rv: $?
#
if [ "$?" -eq 0 ]; then
...
... siis tuo echo vielä tulostaa oikean arvon, mutta samalla echo on itsekin komento (joka onnistuu aina?),
joten tuon echo:n suorituksen jälkeen ehtolause
if [ "$?" -eq 0 ]; then
on aina tosi, sillä komennon echo suoritus asettaa $?:n nollaksi, joten aina 0=0 -> aina tosi.
Eli tässä tapauksessa ongelman voi välttää vaikkapa näin:
V1="$?"
echo rv: $V1
if [ "$V1" -eq 0 ]; then
tuo kopioi $?:n muuttujaan V1, jolloin echo kyllä nollaa $?;n mutta ei siitä tehtyä kopiota V1.
Noissa muissa vastauksissahan ei erikseen echota tuota arvoa ennen if -testiä joten ongelmaa ei niissä ilmene.
nyt kun vielä selviäisi, miten päin AND ja OR -operaatio kohtelee noita arvoja.
yleensähän muissa ohjelmointikielissä false=0, ja
true sitten kielestä riippuen:
a) 1
b) -1
c) mitä tahansa paitsi ei 0
Mutta bashissa ilmeisesti 0=true ?
jos näin niin toimivatko AND ja OR -operaatiot numeeristen arvojen vai totuusarvojen mukaan ?
> Mutta bashissa ilmeisesti 0=true ?
jos näin niin toimivatko AND ja OR -operaatiot numeeristen arvojen vai totuusarvojen mukaan ? <
Tuohon en osaa sanoa mitään, että mitä arvoja loogiset operaatiot bashissä sisäisesti käyttää. Ainoa mitä löysin on tämä, joka vaan listaa kaikki bash-operaattorit:
http://tldp.org/LDP/abs/html/ops.html