বাশ-এর ​​একক কমান্ডের সাহায্যে শেল ভেরিয়েবলগুলিতে ডিফল্ট মান নির্ধারণ করা


682

আমার একটি ব্যাশ (3.00) শেল স্ক্রিপ্টে ভেরিয়েবলের পুরো গোছা রয়েছে যেখানে ভেরিয়েবলটি সেট না করা থাকলে এটি একটি ডিফল্ট বরাদ্দ করে, যেমন:

if [ -z "${VARIABLE}" ]; then 
    FOO='default'
else 
    FOO=${VARIABLE}
fi

আমি মনে করি মনে হচ্ছে এক লাইনে এটি করার জন্য কিছু বাক্য গঠন রয়েছে, এটি একটি টের্নারি অপারেটরের অনুরূপ, যেমন:

FOO=${ ${VARIABLE} : 'default' }

(যদিও আমি জানি যে কাজ করবে না ...)

আমি কি পাগল, নাকি এরকম কিছু রয়েছে?


1
ব্যাশ শেল রেফারেন্সের শেল প্যারামিটার সম্প্রসারণ বিভাগটি ভাল শুরু করার জায়গা: tiswww.case.edu/php/chet/bash/bashref.html# শেল- এক্সপেনশন
কেমিন ঝো

1
শেল প্যারামিটার সম্প্রসারণের জন্য Gnu.org ডকুমেন্টেশন (ইঙ্গিত: আপনি করতে পারেন এমন আরও অনেক দুর্দান্ত জিনিস রয়েছে!)
জেডিবি এখনও মনিকা

উত্তর:


1226

আপনি যা পোস্ট করেছেন তার খুব কাছাকাছি, আসলে:

FOO=${VARIABLE:-default}  # If variable not set or null, use default.

অথবা, যা নির্ধারণ করবে defaultকরার VARIABLEপাশাপাশি:

FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.

64
আমি যদি ডকুমেন্টেশনে এটি সন্ধান করতে চাইতাম তবে গুগল কিসের জন্য চাইবে? Characters {: - like এর মতো বিশেষ অক্ষরের সাথে গুগলিং খুব সহজ নয়।
জোশুয়া ওলসন

20
সৌরবিদ্যার জবাবে: "ব্যাশ ভেরিয়েবল অ্যাসাইনমেন্ট ডিফল্ট" আমাকে এই পৃষ্ঠায় যেতে দিন এবং 'ভেরিয়েবল গাধা' দিয়ে
ব্যাশের

57
নোট এটাই না ব্যাশ-নির্দিষ্ট এবং সমগ্র শেল-পরিবার সঙ্গে কাজ করবে। এটি জেনেরিক-স্ক্রিপ্টগুলির জন্য নিরাপদ।
জোসলিন ডেলাল্যান্ডে

16
@ সোলারমিস্ট মূল শব্দটি হ'ল "বাশ প্যারামিটার সম্প্রসারণ", যদি আপনি এটির এবং এর সহযোগীদের সম্পর্কে আরও জানতে চান।
দুলিশি


289

কমান্ড লাইন আর্গুমেন্টের জন্য:

VARIABLE=${1:-DEFAULTVALUE}    

যা VARIABLEস্ক্রিপ্টে পাস হওয়া প্রথম আর্গুমেন্টের মান বা এই DEFAULTVALUEজাতীয় কোনও আর্গুমেন্ট পাস না করা হলে তার মান নির্ধারণ করে ।


244

যদি ভেরিয়েবল একই হয়, তবে

: "${VARIABLE:=DEFAULT_VALUE}"

সংজ্ঞায়িত না হলে VARIABLE এ DEFAULT_VALUE বরাদ্দ করে। ডাবল উক্তি গ্লোব্বিং এবং শব্দ বিভাজন রোধ করে।

বাশ ম্যানুয়ালটিতে বিভাগ 3.5.3.3, শেল প্যারামিটার সম্প্রসারণও দেখুন


27
এই কৌতুকপূর্ণ কৌশলটি আমার কাছে স্পষ্ট ছিল না, এটি ব্যবহার করে: no {..} এর সম্প্রসারণ খাওয়ার জন্য কোনও প্রতিক্রিয়া নেই UT তবে ভেরিয়েবল সেটটি রেখে। এখন অবধি আমি এটি করছিলাম: VARIABLE = "$ AR VARIABLE: -DEFAULT_VALUE}" এবং দুবার ভারিবেল ব্যবহারের জন্য ডার্ক লাগছে।
ডিনো 18

দেখা যাচ্ছে এটি বাশ-বিল্টিন বৈচিত্রগুলির জন্য সর্বদা কাজ করে না। এটা খুব অদ্ভুত। বর্তমানে আমার কাছে যারা পরিচিত তারা হলেনHISTTIMEFORMAT
ওথিয়াস

আমি কীভাবে একাধিক ডিফল্ট মান সেট করব? আমি চেষ্টা করেছি ": $ AR বৈচিত্র্য: = DEFAULT_VALUE}: $ AR VARIABLE2: = DEFAULT_VALUE2}" তবে তাতে কাজ হয় না বলে মনে হচ্ছে ...
হ্যানস

8
@ হান্স: কোলন হ'ল আদেশ (যা কিছুই করে না) এবং এটি কেবল একবারেই প্রয়োজন। উদাহরণস্বরূপ: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}
প্যাট্রিক

35

এমনকি আপনি অন্য ভেরিয়েবলের মান ডিফল্ট মানের মতো ব্যবহার করতে পারেন

একটি ফাইল আছে defvalue.sh

#!/bin/bash
variable1=$1
variable2=${2:-$variable1}

echo $variable1
echo $variable2

./defvalue.sh first-value second-valueআউটপুট চালান

first-value
second-value

এবং রান ./defvalue.sh first-valueআউটপুট

first-value
first-value

28

এখানে 3.5.3 এর অধীনে দেখুন (শেল প্যারামিটার সম্প্রসারণ)

আপনার ক্ষেত্রে তাই

${VARIABLE:-default}

26

আপনার প্রশ্নের উত্তর দিতে এবং সমস্ত পরিবর্তনশীল বিকল্পে

echo "$\{var}"
echo "Substitute the value of var."


echo "$\{var:-word}"
echo "If var is null or unset, word is substituted for var. The value of var does not change."


echo "$\{var:=word}"
echo "If var is null or unset, var is set to the value of word."


echo "$\{var:?message}"
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly."


echo "$\{var:+word}"
echo "If var is set, word is substituted for var. The value of var does not change."

18

FWIW, আপনি এর মতো একটি ত্রুটি বার্তা সরবরাহ করতে পারেন:

USERNAME=${1:?"Specify a username"}

এটি এর মতো একটি বার্তা প্রদর্শন করে এবং কোড 1 সহ প্রস্থান করে:

./myscript.sh
./myscript.sh: line 2: 1: Specify a username

সমস্ত কিছুর আরও সম্পূর্ণ উদাহরণ:

#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo "$ACTION"
echo "$DIRNAME"
echo "$OUTPUT_DIR"

আউটপুট:

$ ./script.sh foo
foo
/path/to/pwd
/tmp

$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
  • $ACTION প্রথম আর্গুমেন্টের মান নেয় এবং খালি হলে প্রস্থান করে
  • $DIRNAME এটি 2 য় আর্গুমেন্ট এবং বর্তমান ডিরেক্টরিতে ডিফল্ট
  • $OUTPUT_DIRহল তৃতীয় তর্ক, বা $HOMEDIR(যদি সংজ্ঞায়িত করা হয়), অন্যথায় /tmp,। এটি ওএস এক্সে কাজ করে, তবে আমি এটি ইতিবাচক নই যে এটি পোর্টেবল।

17

তারপরে আপনার 'যদি' আরও ক্ষুদ্রভাবে নির্মাণের উপায় প্রকাশের উপায় রয়েছে:

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}

10

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

#!/bin/bash

default='default_value'
value=${1:-$default}

echo "value: [$value]"

এটি স্ক্রিপ্ট.শ হিসাবে সংরক্ষণ করুন এবং এটি কার্যকর করা যায়। প্যারাম ছাড়াই এটি চালান

./script.sh
> value: [default_value]

পরম দিয়ে এটি চালান

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