2015-03-13 25 views
5

Chciałbym napisać skrypt, który sprawdzi, czy kopia się powiodła, czy nie. Oto co mam:Skrypty powłoki Uniksa - Sprawdzanie, czy kopia się powiedzie

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

z „if” nie jest inicjowany. Jak rozwiązać ten problem? Dziękuję za poświęcony czas.

Odpowiedz

18

$? odnosi się do ostatniego polecenia:

#!/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 

Jeśli chcesz wielokrotnie pracować ze statusem określonym poleceniem, zapisz wynik w innej zmiennej:

#!/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 

jednak lepszym podejściem jest po prostu przetestowanie polecenia cp w pierwszej kolejności:

+0

Niezwykle prosty i elegancki. Dzięki za twoje rozwiązanie. –

4

uproszczenie, uproszczenia, uproszczenia:

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

Jeśli chcesz sprawdzić, czy zakończyło się pomyślnie, sprawdzenia statusu ze stwierdzeniem if.

Pamiętaj, że $? to kod zakończenia ostatniego wykonanego polecenia. Jest to bardzo niestabilna zmienna globalna (w C lub C++). W swoim kodzie uruchamiasz echo, który przejmuje wartość w $? z komendy cp. Jeśli trzeba wyraźnie uchwycić $?, zrób tak jawnie i bezpośrednio po poleceniu którego stan trzeba uchwycić:

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

a następnie przetestować $cp_status w poniższym kodzie.

+0

W słowach wielkiego Ric Flair: "WOOOOOOOOOOOO" –