শূন্য থাকলে কীভাবে আমি উদ্ধৃত ভেরিয়েবলকে কিছুতে প্রসারিত করতে পারি?


21

বলুন আমার কাছে একটি স্ক্রিপ্ট রয়েছে:

some-command "$var1" "$var2" ...

এবং, ইভেন্টটি var1খালি থাকলে, আমি বরং এটি খালি স্ট্রিংয়ের পরিবর্তে কোনও কিছু দিয়ে প্রতিস্থাপন করা উচিত, যাতে আদেশটি কার্যকর করা হয়:

some-command "$var2" ...

এবং না:

some-command '' "$var2" ...

ভেরিয়েবলটি পরীক্ষা করার চেয়ে শর্তসাপেক্ষে এর চেয়ে সহজ উপায় কি আছে?

if [ -n "$1" ]; then
    some-command "$var1" "$var2" ...
    # or some variant using arrays to build the command
    # args+=("$var1")
else
    some-command "$var2" ...
fi

ব্যাশ, জেডএস, বা এর মতো কিছুতে প্রসারিত করার চেয়ে প্যারামিটারের বিকল্প কি নেই? আমি এখনও বাকি আর্গুমেন্টগুলিতে গ্লোববিং ব্যবহার করতে চাই, তাই অক্ষম করা এবং ভেরিয়েবলটি সন্ধান করা কোনও বিকল্প নয়।


আমি জানতাম আমি আগেও দেখেছি এবং সম্ভবত এটি ব্যবহার করেছি তবে এটি অনুসন্ধান করা শক্ত প্রমাণিত। : এখন যে মাইকেল সিনট্যাক্স দেখিয়েছেন, আমি মনে যেখানে আমি প্রথম এটি দ্রুত যথেষ্ট দেখা চাই unix.stackexchange.com/a/269549/70524 , unix.stackexchange.com/q/68484/70524
muru

যদি আপনি জানেন যে এটি কোনও ধরণের প্যারামিটার প্রতিস্থাপন, আপনি পৃষ্ঠার প্যারামিটার সম্প্রসারণ বিভাগটি কেন দেখেন নি man? (-;
ফিলিপোস

1
@ ফিলিপস আমি জানতাম না সে সময়টি কী ছিল, কেবল আমি এটি আগে দেখেছি বা ব্যবহার করেছি। পরিচিত এবং অজানা পরিচিত। :(
মুড়ু

1
অতিরিক্ত কুকি পয়েন্টগুলি প্রশ্নের মধ্যে যুক্তিগুলি ধরে রাখতে একটি অ্যারে ব্যবহার করার জন্য উল্লেখ করেছে mentioning
ইল্কাচ্চু

উত্তর:


29

প্যাসিক্স কমপ্লায়েন্ট শেল এবং বাশ এর রয়েছে ${parameter:+word} :

যদি প্যারামিটারটি সেট না করে বা নাল হয় তবে নালটি প্রতিস্থাপন করা হবে; অন্যথায়, শব্দের প্রসার (বা শব্দ বাদ দিলে খালি স্ট্রিং ) প্রতিস্থাপন করা হবে।

সুতরাং আপনি ঠিক করতে পারেন:

${var1:+"$var1"}

এবং var1চেক করা হয়েছে, এবং "$var1"এটি সেট এবং খালি না থাকলে (সাধারণ ডাবল-কোটিং বিধি সহ) ব্যবহার করা হবে। অন্যথায় এটি কিছুই প্রসারিত হয়। মনে রাখবেন যে কেবলমাত্র অভ্যন্তরীণ অংশটি এখানে উদ্ধৃত হয়েছে, পুরো জিনিসটি নয়।

Zsh এ একই কাজ করে। আপনাকে পরিবর্তনশীলটি পুনরাবৃত্তি করতে হবে, সুতরাং এটি আদর্শ নয়, তবে এটি যেমনটি চেয়েছিল ঠিক তেমন কার্যকর হয়।

আপনি যদি খালি যুক্তিতে প্রসারিত করতে কোনও সেট-বা-ফাঁকা ভেরিয়েবল চান তবে ${var1+"$var1"}পরিবর্তে ব্যবহার করুন।


1
আমার জন্য যথেষ্ট ভাল। সুতরাং, এতে, পুরো জিনিসটি উদ্ধৃত হয় না, কেবল wordঅংশটি।
মুড়ু

1
প্রশ্নটি যেমন "বাশ, জেডশ, বা এর মতো" (এবং প্রশ্নোত্তর সংরক্ষণাগারটির জন্য) জিজ্ঞাসা করেছিল, আমি এটি একটি পিক্স বৈশিষ্ট্যটি প্রতিফলিত করার জন্য সম্পাদনা করেছি। এমনকি, আপনি আমার মন্তব্যের পরে যদি প্রশ্নটিতে একটি / ব্যাশ ট্যাগ যোগ করেন। (-;
ফিলিপস

2
আমি এর মধ্যে পার্থক্য সম্পাদনা স্বাধীনতা নিয়েছি :+এবং +
ইলকচাছ

পসিএক্স-কমপ্লায়েন্ট সমাধানের জন্য আপনাকে অনেক ধন্যবাদ! আমি সম্ভাব্য চোকপয়েন্ট স্ক্রিপ্টগুলির জন্য sh/ ব্যবহার করার চেষ্টা করি dash, তাই কেউ যখন বাশকে অবলম্বন না করে কোনও জিনিস কীভাবে সম্ভব তা দেখায় আমি সর্বদা এটির প্রশংসা করি।
জেমস আশ্চর্যডুড

আমি বিপরীত প্রভাবের সন্ধান করছিলাম (এটি নাল হিসাবে শুরু হলে অন্য কিছুতে প্রসারিত করুন)। দেখা যাচ্ছে যে এই যুক্তিটিকে + এ - এ পরিবর্তন করে উল্টানো যেতে পারে: যেমন: $ {খালি_ভার: -পরিবর্তন}
অ্যালেক্স জ্যানসেন

5

যে কি zshডিফল্টরূপে যখন আপনি কোট বর্জন:

some-command $var1 $var2

আসলে, একমাত্র কারণ কেন আপনি এখনও প্যারামিটার সম্প্রসারণ প্রায় zsh কোট প্রয়োজন যে আচরণ (খালি অপসারণ) এড়াতে হিসাবে zshনেই যখন আপনি প্যারামিটার প্রসারণও উদ্ধৃত না (অন্তর্নিহিত বিভক্ত + + অন্য সমস্যা আছে যা অন্য শেল প্রভাবিত গ্লোব)

আপনি অন্য পসিক্স-এর মতো শেলগুলির সাথে একই করতে পারেন যদি আপনি বিভক্তকরণ এবং গ্লোব অক্ষম করেন:

(IFS=; set -o noglob; some-command $var1 $var2)

এখন, আমি যুক্তি দিচ্ছি যে আপনার ভেরিয়েবলের যদি 0 বা 1 মান হয় তবে এটি একটি অ্যারে হওয়া উচিত, স্কেলার ভেরিয়েবল নয় এবং ব্যবহার করুন:

some-command "${var1[@]}" "${var2[@]}"

এবং var1=(value)কখন var1একটি মান ধারণ করতে var1=('')হবে , কখন এটিতে একটি খালি মান var1=()থাকতে হবে এবং কখন এতে কোনও মান থাকবে না তা ব্যবহার করুন।


0

আমি ব্যাশ স্ক্রিপ্টে আরএসসিএনসি ব্যবহার করে ছুটে এসেছি যা -nশুকনো রান টগল করার জন্য বা ছাড়াই কমান্ডটি শুরু করেছিল started দেখা যাচ্ছে যে আরএসসিএনসি এবং বেশ কয়েকটি জিএনএন কমান্ড ''একটি বৈধ প্রথম যুক্তি হিসাবে গ্রহণ করে এবং এটি না থাকলে তার চেয়ে আলাদাভাবে কাজ করে।

নাল প্যারামিটারগুলি প্রায় সম্পূর্ণ অদৃশ্য হওয়ার কারণে এটি ডিবাগ করতে বেশ খানিকটা সময় নিয়েছিল।

Rsync তালিকায় কেউ আমাকে একটি উপায় যখন এই সমস্যা এড়ানোর জন্য দেখিয়েছেন ব্যাপকভাবে আমার কোডিং সরল। যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে এটি @ স্টাফেন চেজেলাসের সর্বশেষ পরামর্শে একটি ভিন্নতা।

বিভিন্ন পৃথক ভেরিয়েবলে আপনার কমান্ড আর্গুমেন্ট তৈরি করুন। এগুলি কোনও ক্রম বা যুক্তিতে সেট করা যেতে পারে যা সমস্যার উপযুক্ত।

তারপরে, শেষে, ভেরিয়েবলগুলি তার যথাযথ জায়গায় সমস্ত কিছু দিয়ে অ্যারে তৈরি করতে ব্যবহার করুন এবং এটি আসল কমান্ডের যুক্তি হিসাবে ব্যবহার করুন।

এইভাবে কমান্ডটি যুক্তিগুলির প্রতিটি পরিবর্তনের জন্য পুনরাবৃত্তি না করে কেবল কোডের এক জায়গায় জারি করা হয়।

খালি যে কোনও ভেরিয়েবল কেবল এই পদ্ধতিটি ব্যবহার করে অদৃশ্য হয়ে যায়।

আমি জানি ইওল ব্যবহার করা অত্যন্ত উজ্জীবিত। আমি সমস্ত বিবরণ মনে রাখিনা, তবে আমার মনে হয়েছিল যে এভাবে কাজ করার জন্য জিনিসগুলি পাওয়া দরকার - এম্বেডড শ্বেত স্পেস সহ পরামিতিগুলি হ্যান্ডেল করার জন্য কিছু।

উদাহরণ:

dry_run=''
if [[ it is a test run ]]
then
  dry_run='-n'
fi
...
rsync_options=(
  ${dry_run}
  -avushi
  ${delete}
  ${excludes}
  --stats
  --progress
)
...
eval rsync "${rsync_options[@]}" ...

আমি প্রশ্নে যা বর্ণনা করেছি তা করার এটি একটি খারাপ পদ্ধতি (শর্তাধীন যুক্তির একটি অ্যারে তৈরি করা)। ভেরিয়েবলগুলি অব্যক্ত রেখে, কে নিজেকে জানে যে কোন সমস্যার জন্য আপনি নিজেকে উন্মুক্ত রেখেছেন।
মুড়ু

@ মুরু ঠিক বলেছেন তবে আমার এখনও এর মতো কিছু দরকার। অন্যান্য উত্তরগুলির কৌশলগুলি ব্যবহার করে কীভাবে এটি ঠিক করা যায় তা আমি বেশ দেখতে পাচ্ছি না। কোনও কোডের টুকরোটি সঠিকভাবে সম্পন্ন করা দেখে এটি দুর্দান্ত হবে যা এগুলি সমস্তকে একসাথে রাখে। আমি পরে যাচ্ছি স্টিফেনের শেষ বিকল্পের সাথে খেলতে যাচ্ছি যা আমি চাই তাই করতে পারে।
জো


ঠিক এই ফিরে পেয়েছি। উদাহরণের জন্য ধন্যবাদ। এটা বোঝা যায়। আমি এটি নিয়ে কাজ করতে যাচ্ছি।
জো

আমার এখানে অনুরূপ ব্যবহারের ঘটনা রয়েছে তবে আপনি এরকম কিছু করতে পারেন: যদি ["$ শুকনো" == "সত্য"]; তারপরে শুকনো = "- n"; ফাই ... সুতরাং পরিবর্তনশীল শুকনোটি যদি সত্য হয় তবে আপনি এটিকে নন-অন করে রাখুন এবং তারপরে আপনি নিজের রাইসাইক্যান্ড কমান্ডটি যথারীতি তৈরি করেন এবং এটির মতো করে রাখুন: rsync {{dry1: + "$ dry1"} ... যদি এটি বাতিল হয় কিছুই হবে না, অন্যথায় এটি আপনার কমান্ডে পরিণত হবে
ফ্রিডো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.