2015-03-13 10 views
5

Ich möchte ein Skript schreiben, das überprüft, ob eine Kopie erfolgreich war oder nicht. Hier ist, was ich habe:Unix Shell Scripting - Überprüfen, ob eine Kopie erfolgreich war

#!/bin/sh 
cp home/testing/present.txt home/testing/future.txt 
    echo "Copy Code: $? - Successful" 
if [ $? != 0 ]; then 
    echo "Copy Code: $? - Unsuccessful" 
fi 

Die „if“ Anweisung nicht initialisiert wird. Wie kann das gelöst werden? Vielen Dank für Ihre Zeit.

Antwort

18

$? bezieht sich auf den letzten Befehl:

#!/bin/sh 
cp home/testing/present.txt home/testing/future.txt 
    echo "Copy Code: $? - Successful" # last command: cp 
if [ $? != 0 ]; then     # last command: echo 
    echo "Copy Code: $? - Unsuccessful" # last command: [ 
fi 

Wenn Sie wiederholt mit dem Status eines bestimmten Befehls arbeiten wollen, nur das Ergebnis in einer anderen Variable speichern:

#!/bin/sh 
cp home/testing/present.txt home/testing/future.txt 
status=$? 
echo "Copy Code: $status - Successful" 
if [ $status != 0 ]; then 
    echo "Copy Code: $status - Unsuccessful" 
fi 

jedoch ein, besserer Ansatz ist, einfach den cp Befehl an erster Stelle zu testen:

if cp home/testing/present.txt home/testing/future.txt 
then 
    echo "Success" 
else 
    echo "Failure, exit status $?" 
fi 
+0

Erstaunlich einfach und elegant. Danke für deine Lösung. –

4

Vereinfachen, vereinfachen, vereinfachen:

#!/bin/sh 
if cp home/testing/present.txt home/testing/future.txt; then 
    echo "Copy Code: $? - Successful" 
else 
    echo "Copy Code: $? - Unsuccessful" 
fi 

Wenn Sie, ob ein Befehl erfolgreich testen wollen, ist, mit der if Anweisung, um den Status zu testen.

Denken Sie daran, dass $? der Exit-Status des letzten ausgeführten Befehls ist. Es ist wie eine extrem flüchtige globale Variable (in C oder C++). In Ihrem Code führen Sie echo, die den Wert in $? aus dem cp Befehl übergibt. Wenn Sie explizit $? erfassen müssen, tun Sie dies ausdrücklich und unmittelbar nach dem Befehl, dessen Status Sie müssen erfassen:

cp home/testing/present.txt home/testing/future.txt 
cp_status=$? 

und dann Test $cp_status in dem folgenden Code.

+0

In den Worten des großen Ric Flair: "WOOOOOOOOOOOO" –