বাশ -e প্রস্থান করে যখন যাক বা এক্সপ্রেট 0 তে মূল্যায়ন করে


19

আমার একটি বাশ স্ক্রিপ্ট রয়েছে যা সেট করে - তাই স্ক্রিপ্টটি কোনও প্রস্থান স্থিতিতে প্রস্থান করবে! = 0।

আমি ভেরিয়েবলগুলিতে নির্ধারিত কিছু বেসিক শেল পাটিগণিত করার চেষ্টা করছি এবং কখনও কখনও এক্সপ্রেশন 0 এর সমান হয় যার ফলে লেট বা এক্সপ্রেস কমান্ডের প্রস্থান স্থিতি "1" হয়ে যায়।

এখানে একটি উদাহরণ:

#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"

আউটপুটটি হ'ল:

$ ./test_error.sh 
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo 'Z will print'
Z will print
+ let 'A=4 - 4'

আমার প্রশ্ন হ'ল আইডোমেটিক বাশ স্ক্রিপ্টিং উপায়টি কী স্ক্রিপ্টটিকে আসল প্রস্থান ত্রুটিগুলিতে ব্যর্থ হতে দেয় এবং বেসিক গাণিতিক সমান 0 এর সাথে নয় not আমি এই সমস্ত অভিব্যক্তিটির সাথে প্রত্যয় করতে পারি:

A=`expr $C - $D`    || true

তবে তা হ্যাকি মনে হচ্ছে।

উত্তর:


16

exprপাটিগণিত জন্য ব্যবহার করবেন না । এটি দীর্ঘকাল ধরে অপ্রচলিত: শেলগুলিতে এখন গাণিতিকগুলি বিল্ট ইন, $((…))কনস্ট্রাক্ট (POSIX), বা letবিল্টিন (ksh / bash / zsh) বা ((…))কনস্ট্রাক্ট (ksh / bash / zsh) এর সাথে রয়েছে।

let((…))সর্বশেষ মূল্যায়িত এক্সপ্রেশন 0 হলে 1 এবং একটি ব্যর্থতার স্থিতি কোডটি প্রত্যাবর্তন করুন 0 এটির ফলে আপনার স্ক্রিপ্টটি নীচে প্রস্থান set -eহতে না পারে, শেষ এক্সপ্রেশনটি 0-এ ফিরে না আসার ব্যবস্থা করুন, উদাহরণস্বরূপ:

let "a = 2 - 2" 1
((a = 2 - 2, 1))

বিকল্পভাবে, || trueআইডিয়ামটি ব্যবহার করুন :

((a = 2 - 2)) || true

বিকল্পভাবে, আপনার গাণিতিকটি ভিতরে $((…))এবং আপনার অ্যাসাইনমেন্টগুলি করুন। একটি অ্যাসাইনমেন্ট মানটিতে সর্বনিম্ন কমান্ড প্রতিস্থাপনের স্থিতি, বা 0 যদি কোনও কমান্ড প্রতিস্থাপন না থাকে, তাই আপনি নিরাপদ হন। এটি কোনও পসিক্স শেল (যেমন ড্যাশ) এ কাজ করার অতিরিক্ত সুবিধা রয়েছে।

a=$((2 - 2))

1

ব্যবহার করুন $(( $C - $D ))আপনার arithmatic জন্য এর পরিবর্তে। এটিও আরও দক্ষ।


কি বলার চেয়ে আরও দক্ষ করে তোলে (( A = $C - $D ))?
বিশপ

1

আমারও একই সমস্যা ছিল । TL; ড:

যদি সর্বশেষ এআরজি [এর যাক] 0 তে মূল্যায়ন করে তবে 1 টি ফিরে আসুক; অন্যথায় 0 ফেরত দিন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.