Czytam plik plist, używając plistbuddy
; i zbieram dane z różnych słowników.plistbuddy - Jak przechwytywać błędy (klucz nie istnieje)
Problem polega na tym, że czasami nie ma tam wartości, z tego czy innego powodu, więc otrzymuję wynik "Key does not exist"
.
Czy istnieje sposób na przechwycenie tego, więc jeśli wartość nie istnieje, mogę zastąpić ją wartością 0 lub inną?
Używam skryptu powłoki; Myślałem, aby użyć prostego oświadczenia if ... else
, próbowałem sprawdzić ciąg "key does not exist"
, ale to nie działa (nigdy nie uderzyłem w warunek true
, zakładam, że wiadomość jest po prostu zamiana na stdout, zamiast być zapisany w mojej zmiennej) .
Dokumentacja nie pomogła, więc utknąłem.
Ponieważ obliczam średnią, błąd powoduje, że moje obliczenia są męczące i dlatego chcę dodać 0, więc mogę sprawdzić później, czy jest 0 i zmienić funkcję, aby odpowiednio obliczyć średnią.
Zasadniczo jest to przykład z mojego kodu: (filename to nazwa pliku plist)
for i in {0..3}
do
TempValue=$(/usr/libexec/PlistBuddy -c "print :process:$i:testname:result" $fileName)
echo $TempValue
Data_results+=($TempValue)
done
# Calculate Average
tmpResult=`echo ${Data_results[0]} + ${Data_results[1]} + ${Data_results[2]} + ${Data_results[3]}|bc`
AverageTime=$(bc <<< "scale=10; $tmpResult/4")
echo "average for test name: " $AverageValue
Dzięki! /usr/libexec/PlistBuddy
narzędzie
Dzięki za odpowiedź. Mam świadomość, że zwraca błąd, gdy się nie powiedzie, ale nie będzie się zachowywać tak, jak się spodziewam. Mam gdzie, jeśli w pętli piszę plist, zbieram 4 wartości; jeśli jednej z wartości nie ma, nie kończę pracy ... skrypt jest kontynuowany. Nie mogę użyć kodu wyjścia, ponieważ nie wykonuję tego narzędzia tylko raz, ale jest to część bardziej złożonego skryptu powłoki. –
@newbiez: Myślę, że masz błędne przekonanie na temat kodów wyjścia: każde wywołanie polecenia w skrypcie ustawia kod wyjścia, wskazując, że to polecenie zakończyło się powodzeniem lub porażką. Możesz uzyskać bezpośredni dostęp do tego kodu wyjścia za pomocą '$?' Lub możesz użyć instrukcji 'if', a operatory' && 'i' || 'działają na sukcesie lub niepowodzeniu. Zapoznaj się z moją zaktualizowaną odpowiedzią dotyczącą fragmentu, który - mam nadzieję - spełnia Twoje oczekiwania. – mklement0
Rzeczywiście nie byłem tego świadomy; Po prostu myślałem, że kod wyjścia jest albo wywoływany przez ciebie gdzieś w skrypcie, z "wyjściem", albo gdy skrypt osiąga koniec. Dziękuję za wyjaśnienie! –