ব্যাশ ব্যবহার করে কোনও ফাংশনের আউটপুট কীভাবে ভেরিয়েবলের কাছে বরাদ্দ করতে পারি?


97

আমার একটি বাশ ফাংশন রয়েছে যা কিছু আউটপুট উত্পাদন করে:

function scan {
  echo "output"
}

এই আউটপুটটিকে আমি কোনও ভেরিয়েবলকে কীভাবে নির্ধারণ করতে পারি?

অর্থাত্ ভিএআর = স্ক্যান (অবশ্যই এটি কাজ করে না - এটি ভিএআর স্ট্রিংকে "স্ক্যান" এর সমান করে তোলে)


4
সম্পর্কিত: stackoverflow.com/q/3236871/435605
AlikElzin-kilaka

উত্তর:


145
VAR=$(scan)

প্রোগ্রামের জন্য ঠিক ঠিক একইভাবে।


4
আমি আবিষ্কার করেছি যে আমি যখন "প্রতিধ্বনি $ VAR" করছিলাম তখন নিউলাইনগুলি ছিনিয়ে নেওয়া হচ্ছে। পরিবর্তে যদি আমি $ VAR উদ্ধৃত করি তবে এটি নতুনলাইনগুলি সংরক্ষণ করে।
ব্রেন্ট

4
এটি 100% ঠিক নয়। কমান্ড প্রতিস্থাপন সর্বদা নতুন লাইনের অনুসরণ করে stri
দ্য বনসাই

7
এটি একটি সাবস্কেল তৈরি করে; একই শেল এটি করার কোন উপায় আছে?
সীমিত প্রায়শ্চিত্ত

24

আপনি অন্যথায় নিয়মিত প্রোগ্রাম ব্যবহার করার কারণে আপনি কমান্ড / পাইপলাইনে বাশ ফাংশন ব্যবহার করতে পারেন। ফাংশনগুলি সাব-শেল এবং ট্রানজিটিভভাবে কমান্ড সাবস্টিটিউশনের জন্যও উপলব্ধ are

VAR=$(scan)

বেশিরভাগ ক্ষেত্রে আপনি যে ফলাফলটি চান তা অর্জন করার সোজা উপায়। আমি নীচে বিশেষ কেস রূপরেখা করব।

ট্রেলিং নিউলাইনগুলি সংরক্ষণ করা:

কমান্ড সাবস্টিটিউশনের অন্যতম (সাধারণভাবে সহায়ক) পার্শ্ব প্রতিক্রিয়া হ'ল এটি যে কোনও সংখ্যক ট্রেলিং নিউলাইনগুলি কেটে ফেলবে। যদি কেউ ট্রেলিং করা নতুন লাইনের সংরক্ষণ করতে চায়, তবে সাবসেলের আউটপুটে একটি ডামি চরিত্র যুক্ত করতে পারে এবং পরবর্তীতে এটি প্যারামিটার প্রসারিত করে ফেলা যায়।

function scan2 () {
    local nl=$'\x0a';  # that's just \n
    echo "output${nl}${nl}" # 2 in the string + 1 by echo
}

# append a character to the total output.
# and strip it with %% parameter expansion.
VAR=$(scan2; echo "x"); VAR="${VAR%%x}"

echo "${VAR}---"

প্রিন্ট (3 টি নতুন লাইন রাখা):

output


---

একটি আউটপুট প্যারামিটার ব্যবহার করুন: সাব-শেল এড়ানো (এবং নতুন লাইনের সংরক্ষণ করা)

ফাংশনটি যা অর্জন করার চেষ্টা করে তা যদি ব্যাশ v4.3 এবং তার উপরে একটি স্ট্রিংকে একটি ভেরিয়েবলের "রিটার্ন" করতে হয় তবে যাকে বলা হয় এটি ব্যবহার করতে পারে nameref। নেমরেফস একটি ফাংশনকে এক বা একাধিক ভেরিয়েবল আউটপুট পরামিতিগুলির নাম নিতে দেয়। আপনি নেমরেফ ভেরিয়েবলকে জিনিসগুলি বরাদ্দ করতে পারেন, এবং এটি এমন হয় যেন আপনি পরিবর্তনটিকে 'পয়েন্ট / রেফারেন্সে' পরিবর্তন করেছেন।

function scan3() {
    local -n outvar=$1    # -n makes it a nameref.
    local nl=$'\x0a'
    outvar="output${nl}${nl}"  # two total. quotes preserve newlines
}

VAR="some prior value which will get overwritten"

# you pass the name of the variable. VAR will be modified.
scan3 VAR

# newlines are also preserved.
echo "${VAR}==="

মুদ্রণ:

output

===

এই ফর্মটির কয়েকটি সুবিধা রয়েছে। যথা, এটি আপনার ফাংশনটিকে কোথাও গ্লোবাল ভেরিয়েবল ব্যবহার না করে কলারের পরিবেশ পরিবর্তন করতে দেয়।

দ্রষ্টব্য: আপনার ফাংশনগুলি ব্যাশ বিল্টিনগুলিতে খুব বেশি নির্ভর করে যদি নেমারেফ ব্যবহার করা আপনার প্রোগ্রামের কার্যকারিতা উন্নত করতে পারে, কারণ এটি একটি সাবশেল তৈরি করা এড়িয়ে যায় যা ঠিক পরে ফেলে দেওয়া হয়। এটি সাধারণত ছোট ফাংশনগুলির প্রায়শই পুনঃব্যবহারের জন্য আরও বোধ করে, যেমন ফাংশনগুলি শেষ হয়echo "$returnstring"

এটি প্রাসঙ্গিক। https://stackoverflow.com/a/38997681/5556676


0

আমি মনে করি init_js স্থানীয় পরিবর্তে ডিক্লেয়ার ব্যবহার করা উচিত!

function scan3() {
    declare -n outvar=$1    # -n makes it a nameref.
    local nl=$'\x0a'
    outvar="output${nl}${nl}"  # two total. quotes preserve newlines
}

localbuiltin কোনো বিকল্প গ্রহণ করবে declarebuiltin গ্রহণ করব। দ্রুত পরীক্ষা থেকে, এটি দেখে মনে হয় যেন declare -nকোনও ফাংশন স্কোপে চলক স্থানীয় সুযোগও দেয়। মনে হয় তারা এখানে বিনিময়যোগ্য।
init_js
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.