ব্যাশ ডিফল্ট মান নির্ধারণ করে


135

{{পরামিতি: = শব্দ} ডিফল্ট মান নির্ধারণ করুন। যদি প্যারামিটারটি সেট না করে বা নাল হয় তবে শব্দের সম্প্রসারণ প্যারামিটারে বরাদ্দ করা হয়। প্যারামিটারের মানটি পরে প্রতিস্থাপিত হয়। অবস্থানগত পরামিতি এবং বিশেষ পরামিতিগুলি এইভাবে বরাদ্দ করা হতে পারে না।

আমি ভেবেছিলাম যে আমি এই বৈশিষ্ট্যটি ${LONG_VARIABLE_NAME:=hello}দীর্ঘতর পরিবর্তে লেখার জন্য ব্যবহার করতে পারি LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}, তবে এখন বাশ 'হ্যালো' চালানোর চেষ্টা করে এবং এটি একটি আদেশ দেয় যা পাওয়া যায় নি। কোন উপায় এড়াতে? নাকি আমার কি পরবর্তীতে লেগে থাকতে হবে? অ্যাসাইন্ট ডিফল্টটি আসলে কার্যকর যেখানে কেউ উদাহরণ দিতে পারেন?


13
পাঠ্যটি উদ্ধৃত করার সময় উত্সটিতে একটি লিঙ্ক অন্তর্ভুক্ত করা সহায়ক।
জোনাথন রেইনহার্ট

উত্তর:


202

কোলন ব্যবহার করুন:

: ${A:=hello}

কোলন হ'ল একটি নাল কমান্ড যা কিছুই করে না এবং এর যুক্তি উপেক্ষা করে। এটি ব্যাশে নির্মিত যাতে নতুন প্রক্রিয়া তৈরি হয় না।


93
আমি সাহায্য করতে পারছি না তবে পর্যবেক্ষণ করতে পারবো : ${A:=hello}ঠিক ততক্ষণ A=${A:-hello}। এটিও মনে হয় যে আধুনিকটি কিছুটা স্বতন্ত্র এবং এর উদ্দেশ্য আরও স্পষ্ট nt ব্যবহারটি :, যা মূলত কোনও অপ-বিকল্প, ওপিতে এটি আগে যেভাবে করছিল তা তুলনা করে কলুষিত মনে হয়।
ড্যান মোল্ডিং

5
@ ক্যামহ: সম্মত আমি দেখতে পাচ্ছি, ডিফল্ট হিসাবে আরম্ভ করার জন্য যদি আপনার প্রচুর ভেরিয়েবল থাকে এবং তাদের দীর্ঘ নাম রয়েছে :তবে টাইপিং এবং পড়া উভয় ক্ষেত্রেই পদ্ধতির পক্ষে অগ্রাধিকারযোগ্য। হ্যাঁ, এটি এমন একটি অঞ্চলের মতো বলে মনে হচ্ছে যেখানে বাশ কিছুটা উন্নতি করতে পারে।
ড্যান মোল্ডিং

17
@DanMoulding: কী : ${VERY_LONG_VARIABLE_NAME:=hello}বনাম: VERY_LONG_VARIABLE_NAME=${VERY_LONG_VARIABLE_NAME:-hello}। আমি আশা করি আপনি আপনার কোডে বর্ণনামূলক পরিবর্তনশীল নামগুলি ব্যবহার করেছেন :)
পাইহেন্টেজি

18
নেই শুধু খাটো, কিন্তু কম ত্রুটি-প্রবণ: VERY_LONG_VARIABLE_NAME=${VERY_LOGN_VARIABLE_NAME:-hello}। উফ।
চিপনার

5
A=$A:-helloপদ্ধতির একটি সুবিধা হ'ল এটি চালিত হওয়ার সাথে সাথে তার স্ব-ডকুমেন্টিং set -x। অর্থাৎ অ্যাসাইনমেন্টটি মুদ্রণ করবে A=helloযেখানে নাল কমান্ডটি কেবল মান ( hello) প্রিন্ট করবে ।
lmsurprenant

107

দয়া করে তাকান http://www.tldp.org/LDP/abs/html/parameter-substitution.html উদাহরণের জন্য

${parameter-default}, ${parameter:-default}

যদি প্যারামিটার সেট না করা থাকে তবে ডিফল্ট ব্যবহার করুন। কল করার পরেও প্যারামিটার সেট করা নেই not
উভয় ফর্ম প্রায় সমতুল্য। :পরামিতি ঘোষিত হলে অতিরিক্তটি একটি পার্থক্য করে তবে শূন্য হয়।

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

${parameter=default}, ${parameter:=default}

যদি প্যারামিটার সেট না করা থাকে তবে পরামিতি মানটি ডিফল্ট হিসাবে সেট করুন।
উভয় ফর্ম প্রায় সমতুল্য। প্যারামিটারটি ঘোষিত এবং নাল হলে কেবলমাত্র পার্থক্য আসে

# sets variable without needing to reassign
# colons suppress attempting to run the string
unset EGGS
: ${EGGS=spam}
echo 1 $EGGS     # 1 spam
unset EGGS
: ${EGGS:=spam}
echo 2 $EGGS     # 2 spam

EGGS=
: ${EGGS=spam}
echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
EGGS=
: ${EGGS:=spam}
echo 4 $EGGS     # 4 spam

EGGS=cheese
: ${EGGS:=spam}
echo 5 $EGGS     # 5 cheese
EGGS=cheese
: ${EGGS=spam}
echo 6 $EGGS     # 6 cheese

${parameter+alt_value}, ${parameter:+alt_value}

যদি প্যারামিটার সেট করা থাকে তবে alt_value ব্যবহার করুন, অন্যথায় নাল স্ট্রিংটি ব্যবহার করুন। কল করার পরেও প্যারামিটারের মান পরিবর্তন হয়নি।
উভয় ফর্ম প্রায় সমতুল্য। প্যারামিটারটি ঘোষিত এবং নাল হলে কেবলমাত্র পার্থক্য আসে

unset EGGS
echo 1 ${EGGS+spam}  # 1
echo 2 ${EGGS:+spam} # 2

EGGS=
echo 3 ${EGGS+spam}  # 3 spam
echo 4 ${EGGS:+spam} # 4

EGGS=cheese
echo 5 ${EGGS+spam}  # 5 spam
echo 6 ${EGGS:+spam} # 6 spam

20

ডিফল্ট মান প্যারামিটার সম্প্রসারণ প্রায়শই নীচের উদাহরণের মতো স্ক্রিপ্টগুলি তৈরিতে কার্যকর। যদি ব্যবহারকারী কেবল স্ক্রিপ্টটিকে যেমন হয় তেমন কল করে তবে পার্লটি নির্মিত হবে না user ব্যবহারকারীর স্পষ্টভাবে এটির জন্য WITH_PERL"না" ব্যতীত অন্য কোনও মান সেট করতে হবে।

$ cat defvar.sh
#!/bin/bash

WITH_PERL=${WITH_PERL:-no}

if [[ "$WITH_PERL" != no ]]; then
    echo "building with perl"
    # ./configure --enable=perl
else
    echo "not building with perl"
    # ./configure
fi

পার্ল ছাড়া বিল্ড

$ ./defvar.sh
not building with perl

পার্ল দিয়ে তৈরি করুন

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