Tôi đang đọc một tệp plist, sử dụng plistbuddy
; và tôi thu thập dữ liệu từ các từ điển khác nhau.plistbuddy - Cách chặn các lỗi (Khóa không tồn tại)
Vấn đề là đôi khi các giá trị không có, vì một lý do này hoặc lý do khác, vì vậy tôi nhận được như đầu ra "Key does not exist"
.
Có cách nào để ngăn chặn điều này, để nếu giá trị không tồn tại, tôi có thể thay thế giá trị bằng 0 hoặc giá trị khác không?
Tôi sử dụng tập lệnh shell; Tôi đã suy nghĩ sử dụng câu lệnh if ... else
đơn giản, cố gắng kiểm tra chuỗi "key does not exist"
nhưng không hoạt động (Tôi chưa bao giờ đạt đến điều kiện true
, tôi cho rằng thông báo sẽ chỉ xuất hiện, thay vì được lưu trong biến của tôi) .
Tài liệu không hữu ích nhiều, vì vậy tôi gặp khó khăn.
Vì tôi tính trung bình, lỗi sẽ làm sai lệch tính toán của tôi và đó là lý do tôi muốn thêm 0, vì vậy tôi có thể kiểm tra sau nếu có 0 và thay đổi hàm để tính trung bình cho phù hợp.
Về cơ bản đây là một ví dụ về mã của tôi: (filename là tên tập tin 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
Cảm ơn! tiện ích /usr/libexec/PlistBuddy
Cảm ơn bạn đã trả lời. Tôi biết rằng nó trả về một mã lỗi khi thất bại, nhưng nó sẽ không hoạt động như tôi mong đợi. Tôi có một nơi mà tôi vòng máng một plist, tôi thu thập 4 giá trị; nếu một trong các giá trị không có, tôi không chỉ đơn giản là thoát ... kịch bản tiếp tục. Vì vậy, tôi không thể sử dụng mã thoát, do thực tế là tôi không thực hiện tiện ích một lần, nhưng nó là một phần của một kịch bản shell phức tạp hơn. –
@newbiez: Tôi nghĩ bạn có quan niệm sai về mã thoát: mọi lệnh gọi một lệnh bên trong tập lệnh đều đặt mã thoát, cho biết lệnh đó đã thoát ra sao về thành công so với thất bại. Bạn có thể truy cập mã thoát này một cách rõ ràng bằng '$?', Hoặc bạn có thể sử dụng các câu lệnh 'if' và' && 'và' || 'để hành động thành công hoặc thất bại. Xin vui lòng xem câu trả lời cập nhật của tôi cho một đoạn mà hy vọng những gì bạn muốn. – mklement0
Thật vậy, tôi đã không nhận thức được điều đó; Tôi chỉ đơn giản nghĩ rằng mã thoát được gọi bởi bạn ở đâu đó trong tập lệnh, với "thoát" hoặc khi tập lệnh kết thúc. Cảm ơn bạn đã làm rõ! –