স্ট্রিং-এ বাশ কমান্ড কার্যকর করা হয় যখন আমি স্ট্রিংটি তৈরি করি না, যখন পরে এটি ব্যবহার করি না


10

আমি স্ক্রিপ্টিং শেল তুলনামূলকভাবে নতুন, কিন্তু প্রায় একটি স্ক্রিপ্ট সম্পূর্ণ করেছি যা lftp প্রোগ্রামটি ব্যবহার করে । আমি যে স্ক্রিপ্টটির সাথে সমস্যায় পড়ছি তার অংশটি যখন আমি কমান্ডগুলির একটি দীর্ঘ স্ট্রিং তৈরি করি (আলাদা করে ;)।

for var in something
do
    ...
    commands_to_run+="echo Result is `tail -n 1 $somefile`;"
done

আমি লক্ষ্য করছি যে tailপ্রোগ্রামটি - ব্যাকটিক্সে আবৃত - যখন লুপটির পুনরাবৃত্তি ঘটছে তখন চলছে, তবে আমি যখন আমার স্ক্রিপ্টে কমান্ডগুলির স্ট্রিংটি পরে প্রার্থনা করব তখন নয়।

দুর্ভাগ্যক্রমে, $ সামফাইলের সামগ্রীগুলি এই পর্যায়ে পরিদর্শন করার জন্য প্রস্তুত নয়। আমার যখন প্রয়োজন হয় তখন আমি কীভাবে আদেশটি কার্যকর করতে পারি এবং আমি স্ট্রিংটি তৈরি করার সময় না?

উত্তর:


8

এটি একটি খুব কৌশলযুক্ত। হউক যে তথ্য সরবরাহ করেছেন তা সঠিক, এটি আপনার ব্যবহারের ক্ষেত্রে এটি পার্স করার বিষয়।

সহজ উপায় হ'ল $()সংশ্লেষটি ব্যবহারের সময় এড়িয়ে চলার সময় $যে পরিবর্তনশীল সংজ্ঞা $()সংজ্ঞাটি সংজ্ঞায়নের সময় প্রদত্ত কমান্ডটি কার্যকর করে না । সতর্কবাণী হ'ল evalনেস্টেড কমান্ড কার্যকর করার জন্য প্রকৃত মৃত্যুর সময় শেল দ্বারা শেষ ফলাফলটি অবশ্যই পুনরায় মূল্যায়ন করতে হবে (মাধ্যমে )।

একটি উদাহরণ দেখতে এটি অনেক সহজ, সুতরাং এটি একটি নিন, যা আপনাকে সঠিক পথে ফেলা উচিত:

for((i=0;i<10;i++)); do 
  date +%s.%N  # Print a timestamp (in format seconds.nanoseconds)
  test="echo \$(date +%s.%N)" # Save a command to do the same
  sleep 1      # Sleep for a second
  eval "$test" # Evaluate the command saved in variable 'test'
  echo         # Print a new line before the next iteration
done

উপরের উদাহরণ থেকে এখানে নমুনা আউটপুট (এক পুনরাবৃত্তিতে ছাঁটা):

1398832186.133661344
1398832187.139076728

আপনি লক্ষ্য করবেন যে প্রতিটি লুপের জন্য দ্বিতীয় টাইমস্ট্যাম্প প্রথমটির প্রায় এক সেকেন্ড পরে। বিপরীতভাবে, যদি আপনি পলায়নের ছাড়া একই পরীক্ষা সঞ্চালন করা $মধ্যে testসংজ্ঞা এবং সরিয়েছে eval, দুই টাইমস্ট্যাম্প প্রায় ম্যাচ হবে।

evalবেশিরভাগ পরিস্থিতিতে ব্যবহার করার অভ্যাসে যাবেন না , তবে এটির মধ্যে এটির একটি যেখানে আমি এড়াতে ভাল উপায় জানি না। আশা করি এটি সাহায্য করবে। শুভকামনা!


অনেক অনেক ধন্যবাদ, আমি $(...)হউকের পরামর্শ মতো ব্যবহার করার চেষ্টা করেছি তবে ব্যাকস্ল্যাশই মূল বিষয়।
রিকি

এটি খুশী হয়েছে - মনে রাখবেন, যদিও এখানে কীটি হ'ল আপনার কমান্ডের চারপাশে ডাবল কোট ( ) না দিয়ে একক উদ্ধৃতি ( ) ব্যবহার evalকরে আপনি একই জিনিসটি করতে পারবেন । $'"
দাবিমার

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

কোন আদেশটি আপনি কার্যকর করতে চেষ্টা করছেন? আপনি যে echoবিলম্ব-সম্পাদন নেস্ট কমান্ডের আউটপুট সহ সামগ্রীগুলি সহ স্ট্রিং করতে চেয়েছিলেন তা আমি ছাপে ছিলাম ।
দাবিমার

1
@ রিকি আমাকে @ হককিজিংয়ের সমস্ত পয়েন্টের সাথে একমত হতে হবে। কোডটি বিয়োগ হিসাবে মাইনাসটি echoকাজ করছে না কারণ কোনও আদেশ নেই eval, বরং একটি স্ট্রিং রয়েছে। আপনার যদি আমাদের কাছে আরও প্রাসঙ্গিক উদাহরণ থাকে তবে আমরা সাহায্য করার চেষ্টা করতে পারি।
দাবিমার

6

উদ্ধৃতি দেওয়ার কয়েকটি স্তর রয়েছে। উদ্ধৃতি চিহ্ন ( "...") রক্ষা হোয়াইটস্পেস এবং বেশ কিছু বিশেষ অক্ষর ( ~, &, |, ;, ...) কিন্তু প্যারামিটার বিস্তার এবং কমান্ড প্রতিকল্পন বাধা দেয় না।

'"বিপজ্জনক" অক্ষরের সামনে আপনার একক উদ্ধৃতি ( ) বা একটি ব্যাকস্ল্যাশ দরকার।

সাধারণভাবে: আপনার $(tail ...)ব্যাকটিকের পরিবর্তে ব্যবহার করা উচিত । ব্যাকটিকগুলি পুরানো স্ট্যান্ডার্ড তবে আমরা এত পুরানো সম্পর্কে কথা বলছি যা $()বেশিরভাগ মানুষের সমস্যার কারণ হয় না। নতুন সংস্করণটি পড়া সহজ এবং নেস্ট করা যায়। এখানে এসেক্সে ফর্ম্যাট করার সমস্যাগুলি একা রাখুন ...


দ্রুত উত্তর হউকের জন্য ধন্যবাদ। দুর্ভাগ্যক্রমে প্রস্তাবিতগুলির সাথে ব্যাকটিকগুলি প্রতিস্থাপন করা $(...)একই ফলাফলটি তৈরি করে - আমার স্ট্রিং সংজ্ঞায়িত হলে শেল এটি কার্যকর করে।
রিকি

@ রিকি যে বিকল্প পরামর্শ ছিল না। আপনি ব্যবহার $()করতে পারেন তবে যাইহোক আপনার একক উদ্ধৃতি প্রয়োজন।
হউক লেগেছে

তাহলে এই চরিত্রগুলির কোনও সংমিশ্রণ আমি কী করব তা অর্জন করবে না?
রিকি

@ রিকি "আপনার একক কোট প্রয়োজন হয়" এ সম্পর্কে বুঝতে এত কঠিন কী? আপনি অবশ্যই এটি ব্যবহার করে দেখুন না।
হউক লেগেছে

প্রকৃতপক্ষে আমি করেছি, তবে আমি যখন একক উদ্ধৃতি ব্যবহার করি তখন প্রতিধ্বনিগুলি কেবল একটি লাইনের প্রতিটি স্ট্রিং হিসাবে মুদ্রণ করে। সম্ভবত একটি উদাহরণ প্রদান সম্পর্কে এত কঠিন কি?
রিকি 3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.