Δημοσιεύτηκε: 26 Μάιος 2012, 18:11
από medigeek
Το $? είναι variable που δίνει το exit status μιας εντολής.
Αν είναι 0, η εντολή εκτελέστηκε σωστά, αν είναι οποιοσδήποτε άλλος αριθμός, υπήρξε σφάλμα.

Το $? μπορείς να το ελέγξεις μόνο αμέσως μετά την εντολή (ή μπορείς να το φυλάξεις σε variable). Αν εκτελεστεί άλλη εντολή, το $? θα αλλάξει.

Παράδειγμα:
έγραψε:$ wget "http://fakedomain.gr" -O -; echo $?
--2012-05-26 16:50:38-- http://fakedomain.gr/
Resolving fakedomain.gr (fakedomain.gr)... failed: Name or service not known.
wget: unable to resolve host address `fakedomain.gr'
4

$ wget "http://google.com/index.test" -O -; echo $?
--2012-05-26 16:51:27-- http://google.com/index.test
Resolving google.com (google.com)... 173.194.39.160, 173.194.39.161, 173.194.39.162, ...
Connecting to google.com (google.com)|173.194.39.160|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://www.google.com/index.test [following]
--2012-05-26 16:51:27-- http://www.google.com/index.test
Resolving http://www.google.com (http://www.google.com)... 173.194.35.180, 173.194.35.176, 173.194.35.177, ...
Connecting to http://www.google.com (http://www.google.com)|173.194.35.180|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2012-05-26 16:51:27 ERROR 404: Not Found.

8

Το 4 και το 8 είναι το $?

Παραδείγματα ως script:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/bin/bash
wget -q "http://google.com/index.test"
wgetstatus="$?"

if [ $wgetstatus -eq 0 ]; then
echo "Success"
else
echo "Something went wrong"
fi


Αν θες να κατεβάζει επ' άπειρον μέχρι η λήψη να γίνει σωστά:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/bin/bash
# Download
wgetstatus="999"
while [ "$wgetstatus" -ne "0" ]; do
echo "Downloading file"
wget -q "http://google.com/index.test" -O myfile.test
wgetstatus="$?"
echo "wget status: $wgetstatus"
sleep 1
done

# Next
echo "wget successful -- continuing script"


Δεν θα συνεχίσει όμως από εκεί που σταμάτησε. Υπάρχει μια επιλογή στο wget (-c) αλλά αν αλλάξει το αρχείο, θα πάρεις το μισό παλιό αρχείο και το μισό καινούργιο, που τις πλείστες φορές δεν θα είναι το καινούργιο αρχείο.
Η καλύτερη λύση σ'αυτή την περίπτωση είναι να το ξανακατεβάσεις από την αρχή.

Αν θέλεις να συνεχίσει από εκεί που έμεινε, η καλύτερη λύση είναι με το rsync (Φυσικά ο server πρέπει να προσφέρει rsync πρωτόκολλο, το οποίο θα πρέπει να συζητήσεις με τον διαχειριστή του server ή με κάποιον αρμόδιο -- τα πανεπιστήμια συνήθως προσφέρουν rsync). Παράδειγμα rsync εντολής με το ubuntu 12.04 iso:
Κώδικας: Επιλογή όλων
rsync -PL rsync://releases.ubuntu.com/releases/precise/ubuntu-12.04-desktop-amd64.iso ./ubuntu-12.04-desktop-amd64.iso