কেন --text = "$ @" কেবল প্রথম শব্দটি পাস করে?


9

যখন আমি নিম্নলিখিত স্ক্রিপ্টটি কিছু আর্গুমেন্ট দিয়ে চালিত করি arg1 arg2 arg3:

#!/bin/bash
zenity --entry --text="$@"

জেনটিটি এই পাঠ্যটির সাথে একটি এন্ট্রি ডায়লগ তৈরি করে: "arg1" যেখানে আমি প্রত্যাশা করি "arg1 arg2 arg3"

আমি যদি নিম্নলিখিত স্ক্রিপ্টের মতো ভেরিয়েবল ব্যবহার করি তবে এটি এন্ট্রি পাঠ্যের জন্য সমস্ত আর্গুমেন্ট দেখায়।

#!/bin/bash
text="$@"
zenity --entry --text="$text"

এই স্ক্রিপ্টগুলির মধ্যে পার্থক্য কী? $@প্রথমটি কেবল প্রথম যুক্তির সাথে প্রতিস্থাপন করে কেন ?

উত্তর:


16

$@ম্যানুয়ালটিতে$* বর্ণিত হিসাবে পৃথক শব্দগুলিতে প্রসারিত হয় (যেখানে এককথায় প্রসারিত হয়) । সুতরাং, আপনি যখন লিখুনbash

zenity --text="$@"

এটি প্রসারিত হয়

zenity --text="$1" "$2" "$3"

তবে শেল ভেরিয়েবল অ্যাসাইনমেন্টগুলিতে শব্দ বিভাজন হয় না। লক্ষ্য করুন ক্ষেত্র / শব্দ বিভাজন মধ্যে পরিবর্তনশীল বরাদ্দকরণ জন্য প্রসারণও তালিকায় বাদ দেওয়া হয় bashম্যানুয়াল । এই আচরণটি পসিক্স স্পেকের সাথে সামঞ্জস্যপূর্ণ । সুতরাং, আপনি যখন লিখুন

text="$@"

ভেরিয়েবলটি textএকক শব্দের মতো অবস্থানগত পরামিতিগুলির সমস্তই পায়, আপনি লিখেছিলেন তার সমতুল্য text="$*"। প্রকৃতপক্ষে, ডায়াল কোটগুলি প্রায়শই চলক কার্যবিবরণীতে অপ্রয়োজনীয় reason উভয়

text=$@

এবং

text=$*

পুরোপুরি নিরাপদ।

সুতরাং,

text=$@
zenity --option="$text"

"$text"একক কথায় প্রসারিত হয়, এ কারণেই এটি কাজ করে। নোট করুন যে --option="$@"কমান্ডের জন্য এটি কেবলমাত্র একটি সাধারণ যুক্তি zenity, এবং শেল ভেরিয়েবল অ্যাসাইনমেন্ট নয়, এ কারণেই এখানে শব্দ বিভাজন ঘটে কিন্তু এতে নয় text=$@


1
+1 টি। এটিও কাজ করবে: zenity --text="$*"- "$*"এককথায় প্রসারিত।
গ্লেন জ্যাকম্যান

আমাকে একটি জিনিস শেখানোর জন্য +1: মানুষ! = ডকুমেন্টেশন। আমার কাছে তথ্য বাশ অনুসন্ধান করা উচিত ছিল, এতে আপনার লিঙ্ক করা ম্যানুয়াল বিভাগও রয়েছে।
manatwork

7

$@ হয়ে ওঠার জন্য পৃথক শব্দে প্রতিটি প্যারামিটার প্রসারিত করুন

zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity

ব্যবহার করুন $*একটি কথাও এটা প্রসারিত করতে পরিবর্তে

zenity --entry --text="$*"

যা হয়ে যাবে

zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity

দয়া করে আলোকপাত কেন ওপি প্রশ্নের কাজ থেকে $ টেক্সট বৈকল্পিক আশানুরূপ
Iruvar

@ চন্দ্ররাভুরি, আপনি আমাকে এটির সাথে ধরেন। ম্যানুয়াল অনুসারে "ওয়ার্ড বিভাজন সম্পাদন করা হয় না," $ @ "" এবং "যদি দ্বিগুণ উদ্ধৃত বিস্তৃতি কোনও শব্দের মধ্যে ঘটে তবে প্রথম প্যারামিটারের প্রসারটি মূল শব্দের প্রথম অংশের সাথে যুক্ত হবে, এবং শেষ প্যারামিটারের প্রসারণটি মূল শব্দের শেষ অংশের সাথে যুক্ত হয়েছে ”", সুতরাং আমি text="$@"প্রসারিত হওয়ার আশা করব text="arg1" "arg2" "arg3", যা ব্যর্থ হওয়া উচিত। তবে অবশ্যই এটি হয় না।
manatwork

@ চন্দ্ররাভুরি কারণ হ'ল ক্ষেত্রের বিভাজন ভেরিয়েবল অ্যাসাইনমেন্টে ঘটে না। আমি আমার উত্তরে আরও বিশদ দিয়ে ব্যাখ্যা করি ।
jw013

@ jw013 কিন্তু অনুযায়ী ব্যাশ রেফারেন্স ম্যানুয়াল , "$@" আছে শব্দ বিভাজন ভুগা, এমনকি পরিবর্তনশীল বরাদ্দকরণ হবে।
রুখ

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