কোনও ভেরিয়েবল সংজ্ঞায়িত না হলে স্ক্রিপ্টটি চালানো এড়িয়ে চলুন


18

আমার কাছে স্ক্রিপ্টটি দেখতে এমন দেখাচ্ছে:

c=0
for f in */*; do
cp -v "$f" "/myhome/CE$(printf '%0*d' 2 $BATCHNUM)-new-stuctures_extracted/test-$(printf '%0*d' 5 $c)"
c=$((c=c+1))
done

তবে, ব্যবহারকারীকে অবশ্যই একটি পরিবর্তনশীল কল BATCHNUM সরবরাহ করতে হবে এবং অন্যথায় আমাকে এই স্ক্রিপ্টটি চলমান বন্ধ করতে বাধ্য করতে হবে। যদি আমি এই স্ক্রিপ্টটি কল করে এমন স্ক্রিপ্টটিকে জোর করে বন্ধ করতে পারি তবে আরও ভাল হবে (বা এমনকি # 1 স্ক্রিপ্ট যা # 2 স্ক্রিপ্টকে এই স্ক্রিপ্টটি কল করে)।

উত্তর:


30

দ্রুততম উপায়টি সম্ভবত স্ক্রিপ্টের শুরুতে এই দুটি লাইন যুক্ত করা:

set -u # or set -o nounset
: "$BATCHNUM"

প্রথম লাইন nounsetস্ক্রিপ্টটি চালিত শেলের মধ্যে বিকল্পটি সেট করে , যা আপনি যদি আনসেট ভেরিয়েবলটি প্রসারিত করার চেষ্টা করেন তবে তা বন্ধ হয়ে যায়; দ্বিতীয়টি $BATCHNUMকোনও কোনও বিকল্পের প্রেক্ষিতে প্রসারিত হয়, অন্য কিছু করার আগে অ্যাওর্টটিকে ট্রিগার করতে।

আপনি যদি আরও সহায়ক ত্রুটি বার্তা চান তবে আপনি পরিবর্তে এটি লিখতে পারেন:

if [[ -z "$BATCHNUM" ]]; then
    echo "Must provide BATCHNUM in environment" 1>&2
    exit 1
fi

অথবা সাদৃশ্যপূর্ণ.


18

এখানে আপনি চেক করতে চান BATCHNUMসেট করা হয়েছে এবং নাল নয়।

পসিক্স শেল এই কাজের জন্য একটি প্যারামিটার সম্প্রসারণ সরবরাহ করে । ব্যবহার করার আগে এই লাইনটি যুক্ত করুন BATCHNUM:

: "${BATCHNUM:?Variable not set or empty}"

বা BATCHNUMযদি ব্যবহারকারী কোনও সরবরাহ না করে তবে এর জন্য ডিফল্ট মান সেট করা আরও ভাল :

: "${BATCHNUM:=3}"

4
[ -n "$BATCHNUM" ] || { kill "$PPID"; exit 1; }
#Unless $BATCHNUM is defined and unempty, ask parent process to exit and exit w/ 1

এটি ব্যাশ এবং একটি পসিক্স sh এ কাজ করবে। আমি খালি ভেরিয়েবল এবং অপরিজ্ঞাত ভেরিয়েবলের মধ্যে পার্থক্য না করা পছন্দ করি (যেমন, আমি পছন্দ করি না set -u, তবে এটি কেবল আমার)।


2

রেখাগুলি

if [ -z "$BATCHNUM" ]; then
    exit 2;
fi

খালি জন্য চেক করুন $BATCHNUM। সঙ্গে $PPIDযাই হোক না কেন আপনি আপনার পিতা বা মাতা করতে চান ক্ষতি আপনি কি করতে পারেন ( kill $PPID)। আপনার পিতামহাকে খুন করার জন্য, আপনাকে অন্য উপায়ে প্রক্রিয়া আইডি নেওয়া দরকার যেমন ডেটা দেখার জন্য /proc/$PPID

তবে, যদি আপনার পিতামাতার মৃত্যু হয়, এটি আপনাকে একটি সংকেত ( SIGHUP) প্রেরণ করে , সুতরাং আপনি কাউকে হত্যা শুরু করার আগে আপনাকে এটি আটকাতে হবে:

trap '' SIGHUP

আপডেট: আপনি যদি মনে করেন আপনার পিতামাতাকে হত্যা করতে হবে তবে আপনি এটি ভুল করছেন। স্রেফ একটি অর্থবহুল এক্সকোড ফিরিয়ে দিন। অভিভাবক স্ক্রিপ্টের বলা স্ক্রিপ্টের রিটার্ন কোডটি চেক করা উচিত এবং সেই অনুযায়ী প্রতিক্রিয়া জানানো উচিত।


1
কিছুটা নিষ্ঠুর .... :)
ব্যবহারকারীর 40780

1

BATCHNUMসংজ্ঞায়িত হয়েছে কি না তা পরীক্ষা করতে এবং এটি যদি না হয় তবে প্রস্থান করুন:

if [ -n "${BATCHNUM-a}" ]; then
  echo >&2 "Fatal error: BATCHNUM not set"
  exit 2
fi

আপনি যদি BATCHNUMখালি ক্ষেত্রে কেসটিও প্রত্যাখ্যান করতে চান তবে ${BATCHNUM:+a}পরিবর্তে ব্যবহার করুন ${BATCHNUM+a}${VARIABLE+TEXT_IF_NULL}প্যারামিটার সম্প্রসারণ কন্সট্রাক্ট সম্পর্কে তথ্যের জন্য , যেমন বাশ ম্যানুয়াল দেখুন

পিতামাতার প্রক্রিয়াটি হত্যা করবেন না। পিতামাতার প্রক্রিয়াটি কী তা আপনি জানেন না। যদি এই স্ক্রিপ্টটি বাতিল হয় তবে এমন কোনও স্ক্রিপ্ট যদি গর্ভবতী হওয়া দরকার তবে এ স্ক্রিপ্টের প্রস্থান স্থিতি পরীক্ষা করে দেখুন। স্ক্রিপ্ট # 2 তে যেমন:

script3 || exit $?

অথবা set -eকোনও কমান্ড যদি ব্যর্থতা (ননজারো) স্থিতি ফিরিয়ে দেয় তবে স্ক্রিপ্টটি বাতিল করতে ব্যবহার করুন ।

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