বাশ ভেরিয়েবল এক্সপেনশন কেন কোট ধরে রাখে?


12
> echo "hi"
hi
> VAR='echo "hi"'
> $VAR
"hi"

উপরের কমান্ডগুলির আউটপুট কেন পৃথক?

একক উদ্ধৃতিতে একই রকম ঘটনা ঘটে:

> VAR="echo 'hi'"
> $VAR
> 'hi'

6
ভেরিয়েবলগুলিতে এক্সিকিউটেবল স্ক্রিপ্ট স্নিপেট এম্বেড করার অভ্যাসটি পান না। এটি সর্বোত্তম কৌশল হিসাবে দেখা দেয় এবং evalসম্ভাব্য সুরক্ষা গর্তগুলির একটি খনি ক্ষেত্র যা আপনাকে খুব সাবধানে চলতে হবে
jw013

@ jw013 ভাল পয়েন্ট এবং দুর্দান্ত নিবন্ধ। আমি "ভেরিয়েবলগুলি ডেটা ধরে রাখে, ফাংশনগুলি হোল্ড কোড ধারণ করে" like প্রথম লিংক থেকে, কিন্তু আমার ব্যবহারের জন্য, ডাটা যে একটা ফাংশন দেওয়া হয় (এই ক্ষেত্রে, at) হয় কোড। কোডটি সংগঠিত / সংগ্রহ করার নিরাপদ উপায়ে কোনও টিপস যা আপনাকে দেওয়া হবে at?
Cory Klein

atshইনপুট হিসাবে বাক্য গঠন গ্রহণ করে । সুতরাং ইনপুট তৈরির atঅর্থ হ'ল shস্বেচ্ছাসেবী ইনপুট থেকে বৈধ, সঠিকভাবে উদ্ধৃত বাক্য গঠন যা তুচ্ছ নয়, তাই আমি যদি সম্ভব হয় তবে এড়াতে চেষ্টা করব। আপনি যা অর্জন করার চেষ্টা করছেন তার উপর যদি আপনি আরও কিছু বিশদ দিতে পারেন তবে এটি সত্যিই সহায়তা করবে।
jw013

দুঃখিত, আমি খুব বেশি বিশদে বিশৃঙ্খলা করতে চাইনি, তবে আমি যা করছি তা আসলে জটিল নয়, আইএমও। আমি একটি স্ক্রিপ্ট তৈরি করছি যা "সময়" এবং একটি "বার্তা" লাগে। এটি atপ্রদত্ত "সময়" এর জন্য সঞ্চালিত হয় এবং atকমান্ডটি চালিত করতে বলে dzen2dzen2স্টিডিনের থেকে "বার্তা" নেয় এবং কিছু অন্যান্য স্ট্যাটিক পরামিতিও ব্যবহার করে। অসুবিধাটি হ'ল আমাকে ব্যবহারকারীর কাছ থেকে "বার্তা" পরামিতিটি dzen2কমান্ডটিতে পাইপ করা দরকার , তবে আমি আসলে dzen2নিজেকে চালাচ্ছি না , আমি atএটি করতে বলছি ।
Cory Klein

উত্তর:


16

অতিরিক্ত যুগল উদ্ধৃতি কেবলমাত্র অতিরিক্ত মূল্যায়নের পদক্ষেপেই গ্রাস করা হবে। উদাহরণস্বরূপ eval:

bash-4.2$ VAR='echo "hi"'

bash-4.2$ $VAR
"hi"

bash-4.2$ eval $VAR
hi

তবে সাধারণত একটি স্ট্রিংয়ে প্যারামিটার সহ কমান্ডগুলি রাখা খারাপ ধারণা। পরিবর্তে একটি অ্যারে ব্যবহার করুন:

bash-4.2$ VAR=(echo "hi")

bash-4.2$ "${VAR[@]}"
hi

1
এও লক্ষ করা গুরুত্বপূর্ণ যে উদ্ধৃতিগুলি আলাদাভাবে মূল্যায়ন করা হয়; ডাবল কোট (") বদ্ধ স্ট্রিংয়ের মূল্যায়নের অনুমতি দেয়, একক উদ্ধৃতি (') স্ট্রিংকে আক্ষরিক হিসাবে মুদ্রণ করে। উদাহরণ: "$(ls)"এবং '$(ls)'। এই কারণেই মূল প্রশ্নগুলির উদাহরণগুলিতে উদ্ধৃতি উপস্থিত হয়।
জোসেফ কার্ন

একটি অ্যারেও সমস্যার উত্স। কোডটি ফাংশনগুলির সাথে সম্পর্কিত, ভেরিয়েবলের ডেটা। আপনি যে উদাহরণটি উপস্থাপন করছেন তা কেবলমাত্র এয়ারের বিভাজনে উদ্ধৃতিগুলি সরানো হওয়ায় কাজ করে। এ printf '<%s> ' "${VAR[@]}"দেখায় যে ইতিমধ্যে উদ্ধৃতিগুলি সরানো হয়েছে। আপনি যদি VAR=(echo \"hi\")$ ${VAR[@]}"hi"

9

উদ্ধৃতি অপসারণ কেবলমাত্র মূল ইনপুট শব্দের ক্ষেত্রে ঘটে, বিস্তারের ফলাফলের ফলে নয় । প্রসারিত ভেরিয়েবলের অংশ যে উদ্ধৃতিগুলি স্পর্শকৃত নয়।


2

আপনি যদি কিছুটা পিছিয়ে যান, আপনি দেখতে পারেন কেন ভেরিয়েবল প্রতিস্থাপনের একদম উদ্ধৃতি বজায় রাখা উচিত।

ইউনিক্স / লিনাক্স / বিএসডি শেলের উদ্ধৃতিগুলির বিন্দুটি এমন একটি স্ট্রিংয়ের টুকরো একসাথে রাখা যা অন্যথায় একাধিক স্ট্রিং হিসাবে বিভক্ত হয়ে যায়। যেহেতু ডিফল্টরূপে শেলটি একটি টোকেন বিভাজক হিসাবে শ্বেতক্ষেত্র ব্যবহার করে, স্পেস সহ একটি স্ট্রিং ("এক দুই তিন" এর মতো) যদি উদ্ধৃত না হয় বা কোনওভাবে পালিয়ে যায় তবে 3 টি স্ট্রিং হিসাবে পার্স করা হবে: "এক", "দুটি" এবং "তিন"।

যদি কোনও প্রোগ্রামার কিছু পরিবর্তনশীল ইন্টারপোলটেডের মান সহ একটি স্ট্রিং চায়:

VAR=two
STRING="one $VAR three"

শেলটি একেবারে কোটগুলি মুছে ফেলা উচিত নয়: স্পেসগুলি যুক্ত স্ট্রিংটি 3 টি ছোট স্ট্রিং হিসাবে পার্স করা হবে।

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