ডিফল্ট মান সহ ব্যাশে ভেরিয়েবল পড়ুন


191

ট্যাপিনাল থেকে বাশ স্ক্রিপ্টে একটি মান পড়তে হবে। আমি ব্যবহারকারীকে পরিবর্তন করতে পারে এমন একটি ডিফল্ট মান সরবরাহ করতে সক্ষম হতে চাই।

# Please enter your name: Ricardo^

এই স্ক্রিপ্টে প্রম্পটটি হ'ল "দয়া করে আপনার নাম দিন:" ডিফল্ট মানটি "রিকার্ডো" এবং কার্সারটি ডিফল্ট মানের পরে হবে। বাশ স্ক্রিপ্টে এটি করার কোনও উপায় আছে কি?

উত্তর:


279

আপনি প্যারামিটার বিস্তৃতি যেমন ব্যবহার করতে পারেন

read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name

বন্ধনীগুলির মধ্যে প্রম্পটে ডিফল্ট মান অন্তর্ভুক্ত করা মোটামুটি প্রচলিত কনভেনশন


7
আমি এর ভিত্তিতে কিছু করা শেষ করেছি। একটি অস্থায়ী ভেরিয়েবলের পড়া inputএবং তারপরে ব্যবহার name=${input:-$name}
রিকার্ডো মেরিমন

41
এটি আসলে প্রশ্নের উত্তর দেয় না। প্রম্পটে ডিফল্ট মান প্রদর্শন করা উচিত।
ডাঃ ব্যক্তি ব্যক্তি ২ য়

3
এবং কি করবে name=${!input:-$name}?
হ্যারি লি

8
@ Dr.PersonPersonII - আপনি ভালো কিছু করে ডিফল্ট মান যোগ করতে পারিনি: -p পড়া "দূরবর্তী হোস্ট নাম [$ remote_host_default] লিখুন:" REMOTE_HOST REMOTE_HOST = $ {REMOTE_HOST: - $ remote_host_default}
Dobler

4
$1হয়ে যায়${1:-some_default_string}
ThorSummoner

159
read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME

1
দুর্দান্ত উত্তর! আমি কেবল উল্লেখ করতে চাই যে আমার এটির সাথে সমস্যা হয়েছিল কারণ আমি "রিকার্ডো" এবং NAME এর মধ্যে স্থান দেখিনি, তবে একবার আমি বুঝতে পেরেছিলাম যে .... জাদু ! ধন্যবাদ!
মিঃ মিক্কেল

40
দুর্ভাগ্যক্রমে -i OSX 10.7 এর জন্য একটি বৈধ বিকল্প নয়
সংজ্ঞায়িত

3
: @BrianMortenson আপনি homebrew ব্যবহার ব্যাশ আপগ্রেড করতে পারেন stackoverflow.com/questions/16416195/...
antonagestam

2
এই উত্তরটি শো OS X এর (ব্যাশ 3.x) এ এই কাজ করতে দেয়: stackoverflow.com/questions/22634065/...
ক্রিস্টোফ Petschnig

3
কেবলমাত্র নোট করুন যে বাস্তবে কাজ -eকরার অনুমতি -iদেওয়া বাধ্যতামূলক বলে মনে হচ্ছে
মস্ত্রেলিয়ন

48

বাশ 4 এ:

name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"

এটি প্রম্পটের পরে নামটি এভাবে প্রদর্শন করে:

Please enter your name: Ricardo

নামের শেষে কার্সার দিয়ে এবং ব্যবহারকারীকে এটি সম্পাদনা করার অনুমতি দেয়। সর্বশেষ লাইনটি বিকল্প and


Bash4 ব্যবহার করতে পারবেন না কারণ এটি ডেবিয়ান বিতরণে মানক নয়। আমার এমন কিছু দরকার যা খুব ঝামেলা ছাড়াই কাজ করবে।
রিকার্ডো মেরিমন

1
কোন কোড শেষ লাইন প্রয়োজনীয়তার শুধু ব্যবহার nameপরিবর্তে inputমধ্যে readকমান্ড।
আরএনএ

1
@ আরএনএয়ার: অতিরিক্ত ভেরিয়েবল ব্যবহার করে, $nameযদি ব্যবহারকারী প্রস্তাবিত মানটি মুছে ফেলেন (এবং এইভাবে একটি নাল স্ট্রিং ইনপুট করে) এর মান সংরক্ষণ করা হয়। এটি আপনার প্রয়োজনের উপর নির্ভর করে। আমি আমার উত্তরে যতটা বলেছি। তুমি ঠিক আছে, যদিও, আমি অনেক বেশী সুনিদৃষ্ট হয়েছে এবং পারতেন বলেন যে যদি ঐচ্ছিক লাইন তারপর ব্যবহার করা হয়নি পরিবর্তনশীল হয়ে থাকতে পারে name
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
@ ডেনিস উইলিয়ামসন: আপনি ঠিক বলেছেন। এটি যদি চায় তবে এটি একটি ভাল অনুশীলন।
আরএনএ

16

কোড:

IN_PATH_DEFAULT="/tmp/input.txt"
read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"

OUT_PATH_DEFAULT="/tmp/output.txt"
read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"

echo "Input: $IN_PATH Output: $OUT_PATH"

নমুনা রান:

Please enter IN_PATH [/tmp/input.txt]: 
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt

আমি এটি পছন্দ করি কারণ এটি কনভেনশন অনুসরণ করে যা আমি প্রচুর শেল স্ক্রিপ্টগুলিতে দেখতে পাই যেখানে কোলনের আগে ডিফল্ট মান বর্গাকার বন্ধনীতে থাকে। ধন্যবাদ !!!
মরফ্যাটিক

16

আমি এই প্রশ্নটি পেয়েছি, এরকম কিছু উপস্থাপনের জন্য উপায় খুঁজছি:

Something interesting happened.  Proceed [Y/n/q]:

উপরোক্ত উদাহরণগুলি ব্যবহার করে আমি এটি হ্রাস করেছি: -

echo -n "Something interesting happened.  "
DEFAULT="y"
read -e -p "Proceed [Y/n/q]:" PROCEED
# adopt the default, if 'enter' given
PROCEED="${PROCEED:-${DEFAULT}}"
# change to lower case to simplify following if
PROCEED="${PROCEED,,}"
# condition for specific letter
if [ "${PROCEED}" == "q" ] ; then
  echo "Quitting"
  exit
# condition for non specific letter (ie anything other than q/y)
# if you want to have the active 'y' code in the last section
elif [ "${PROCEED}" != "y" ] ; then
  echo "Not Proceeding"
else
  echo "Proceeding"
  # do proceeding code in here
fi

আশা করি যে কাউকে একই সমস্যা দেখা দিলে যুক্তি চিন্তাভাবনা করতে না সহায়তা করে


খুব সুন্দর. কেউ যদি কেবল "কে" বা প্রদত্ত পছন্দগুলি বাদ দিয়ে অন্য কিছু প্রবেশ করে তবে এই প্রশ্নের পুনরাবৃত্তি করা একটু উন্নত হতে পারে।
এরিকবার্ক

1
আমি কেবল একটি স্ক্র্যাচ চুলকানির পরে এই মন্তব্যটি লিখেছি। আমার এখন একটি শেল ফাংশন রয়েছে, যার উপরের অংশটি অন্তর্ভুক্ত রয়েছে এবং আমি এটি ব্যবহারের প্রবণতা রাখি। শেলটি সুন্দরভাবে লুপ করবে বলে মনে হয় না, তাই আমি এড়াতে চেষ্টা করি। আমি আমার ফাংশন থেকে ফলাফলটি পরীক্ষা করতে পারি এবং আরও একবার চেষ্টা করতে পারি, তবে মূলত, আমি অ্যাডমিন সরঞ্জামগুলি লিখছি যেখানে জিনিসগুলি ভুল হতে পারে, তাই আমি চাই প্রশাসক যে কোনও সময়ে পরিষ্কারভাবে স্ক্রিপ্টটি থামাতে সক্ষম হন।
sibaz

11

আমি স্রেফ এই প্যাটার্নটি ব্যবহার করেছি, যা আমি পছন্দ করি:

read name || name='(nobody)'

6
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname

ডিফল্ট সেট করুন; এটা ছাপাও; একটি নতুন মান পড়ুন; যদি কোনও নতুন মান থাকে তবে এটি ডিফল্টের জায়গায় ব্যবহার করুন। প্রম্পটের শেষে একটি নিউলাইন কীভাবে দমন করা যায় সে সম্পর্কে শেল এবং সিস্টেমগুলির মধ্যে কিছু (বা ছিল) কিছু পরিবর্তন রয়েছে। '\ সি' স্বরলিপিটি ম্যাকস এক্স 10.6.3 এ 3.x বাশ দিয়ে কাজ করবে বলে মনে করে এবং বর্ন বা কর্ন শেল ব্যবহার করে সিস্টেম ভি থেকে প্রাপ্ত ইউনিক্সের বেশিরভাগ রূপগুলিতে কাজ করে।

এছাড়াও মনে রাখবেন যে ব্যবহারকারী সম্ভবত বুঝতে পারবেন না যে পর্দার আড়ালে কী চলছে; ইতিমধ্যে পর্দায় নামের পরে তাদের নতুন ডেটা প্রবেশ করা হবে। এটি ফর্ম্যাট করা ভাল হতে পারে:

echo "Please enter your name ($name): \c"

printfচেয়ে বেশি পোর্টেবলecho
ghostdog74

3
@ ঘোস্টডোগ 74৪: সম্ভবত তাই; আমাদের মধ্যে যারা 25 বছর আগে শেল প্রোগ্রামিং শিখেছে তাদের আমাদের কাজকর্মগুলির মধ্যে কোনটি এখনও প্রাসঙ্গিক তা কার্যকর করতে কঠোর সময় কাটাতে হয়। এটি ক্রমবর্ধমান দেখে মনে হচ্ছে বাশ ঠিক সবকিছুই আবার লিখেছিল। আমি জানি যে কমান্ড হিসাবে প্রিন্টফের প্রায় সময় হয়েছে - আমি খুব কমই এটি ব্যবহার করি, যদিও (সম্ভবত - কখনও নয়)? আমি (পুনরায়) বাশ শিখার আগ পর্যন্ত শেলটি বন্ধ করে দেওয়া উচিত আমার এমন ধারণাটি পাওয়া যায়। 'তিস মজার; আমি যে সফ্টওয়্যারটিতে কাজ করি তাতে শেল স্ক্রিপ্ট রয়েছে যা ভাল কাজ করে না - তবে সমস্যাটি বাশ-হস্ত নয়। আমি ঠিক ' if (test -z "$xxx"); ...' এবং অন্যান্য সি শেলিজমগুলি ঠিক করতে বিরক্ত হয়েছি।
জোনাথন লেফলার

আমি অবাক যে বাশ সমর্থন করে \c, যেহেতু এটি সমর্থন করে echo -n! যাইহোক, আপনাকে -eপালানোর ব্যাখ্যা করতে বাশের প্রতিধ্বনি যোগ করতে হবে। আমি অনুমান করি যে \cecho -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
শোধ করা হয়নি

1
#Script for calculating various values in MB
echo "Please enter some input: "
read input_variable
echo $input_variable | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'

3
আপনার উত্তরে ব্যাখ্যা যোগ করুন।
সুফিয়ান ঘোরি

-1

-E এবং -t প্যারামিটার একসাথে কাজ করে না। আমি কিছু এক্সপ্রেশন চেষ্টা করেছি এবং ফলাফলটি নিম্নলিখিত কোড স্নিপেট ছিল:

QMESSAGE="SHOULD I DO YES OR NO"
YMESSAGE="I DO"
NMESSAGE="I DO NOT"
FMESSAGE="PLEASE ENTER Y or N"
COUNTDOWN=2
DEFAULTVALUE=n
#----------------------------------------------------------------#
function REQUEST ()
{
read -n1 -t$COUNTDOWN -p "$QMESSAGE ? Y/N " INPUT
    INPUT=${INPUT:-$DEFAULTVALUE}
    if  [ "$INPUT" = "y" -o "$INPUT" = "Y" ] ;then
        echo -e "\n$YMESSAGE\n"
        #COMMANDEXECUTION
    elif    [ "$INPUT" = "n" -o "$INPUT" = "N" ] ;then
        echo -e "\n$NMESSAGE\n"
        #COMMANDEXECUTION
    else
        echo -e "\n$FMESSAGE\n"
    REQUEST
    fi
}
REQUEST

আপনার উত্তরটি প্রশ্নের সাথে খুব একটা করার নেই, আছে?…
gniourf_gniourf

-e এবং -t পরামিতি ব্যবহার করার জন্য এটি প্রায় কাজ। এই কোডলাইনটি (-e এবং -i ডিফল্ট মানের জন্য): পড়ুন -e -p "আপনার নাম লিখুন:" -i "রিকার্ডো"
নাম্বার

হ্যাঁ তবে এটিকে প্রশ্ন করা হয়নি, তাই না?
gniourf_gniourf

3
আপনি যা করতে পারেন তা হল একটি নতুন প্রশ্ন জিজ্ঞাসা করা, এবং নিজের উত্তর দিন ;)। এটি এসও অনুমোদিত! তবে আমরা অপ্রাসঙ্গিক স্টাফ সহ অন্যান্য প্রশ্নকে দূষিত করতে চাই না।
gniourf_gniourf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.