একটি উত্তরাধিকারী মধ্যে ভেরিয়েবল পাস এবং সেট


18

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা বিভিন্ন রিমোট মেশিনে বিভিন্ন জিনিস করতে হয়। আমি ভেবেছিলাম যে একজন হেরডোক এর জন্য কাজ করবে তবে আমি স্ক্রিপ্টে অন্য কোথাও সংজ্ঞায়িত একটি ভেরিয়েবল এবং হেরডোকে সংজ্ঞায়িত একটি ব্যবহার করতে সক্ষম নই ।

এখানে কিছু কোড রয়েছে:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

এটি কেবল নিম্নলিখিতগুলি মুদ্রণ করে:

যদি foo =

বার = বার

তবে, আমি যদি ইওএফ লাইনটি এর মতো উদ্ধৃত করি: ssh some.remote.host << "EOF" তবে এটি কেবল নিম্নলিখিতটি মুদ্রণ করে:

যদি foo = foo বিন্যাস

বার =

আমি হেরডোকের ভিতরে কীভাবে উভয় ভেরিয়েবল ব্যবহার করতে পারি তার কোনও ইঙ্গিত ?

ধন্যবাদ।

উত্তর:


27

সংক্ষেপে, ব্যবহার করুন:

  • অব্যক্ত হেরডোক কিওয়ার্ডস, যেমন, EOF
  • বাইরের (যেমন স্থানীয় ) ভেরিয়েবলের জন্য নিয়মিত ডলার চর , যেমন,$FOO
  • অভ্যন্তর (যেমন দূরবর্তী ) ভেরিয়েবলের জন্য ডলারের চর এড়িয়ে গেছে , যেমন\$BAR

আপনি যদি EOFহেরেডোক কীওয়ার্ডটি (যেমন ) অব্যক্ত রেখে যান তবে হেরডোক বডিটি স্থানীয়ভাবে প্রক্রিয়াজাত হয়, যাতে এটি $FOOপ্রসারিত হয় fooএবং BARখালি স্ট্রিংয়ে প্রসারিত হয়। তারপরে আপনার sshআদেশটি হয়ে যায়:

BAR="bar"
echo "FOO=foo"
echo "BAR="

আপনি যদি হেরডোক কীওয়ার্ডটি উদ্ধৃত করেন তবে পরিবর্তনশীল প্রসারকে দমন করা হয়, যাতে আপনার sshআদেশটি পরিবর্তে এটি হয়ে যায়:

BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"

যেহেতু FOOসম্ভবত দূরবর্তী শেল পরিবেশে সংজ্ঞায়িত করা হয়নি, তাই এক্সপ্রেশনটি "FOO=$FOO"মূল্যায়ন করা হয় "FOO=''", অর্থাৎ FOOখালি স্ট্রিংয়ে সেট করা হয়েছে।

যদি আপনি উভয় ভেরিয়েবল ব্যবহার করতে চান তবে আপনাকে হেরডোক কীওয়ার্ডটি উদ্ধৃত করতে হবে না, যাতে স্থানীয়ভাবে সংজ্ঞায়িত ভেরিয়েবলের জন্য ভেরিয়েবল প্রসার ঘটে এবং তারপরে (ব্যাকস্ল্যাশ সহ) যে চলকটি আপনি দূরবর্তীভাবে প্রসারিত করতে চান তা পালাতে হবে, অর্থাৎ :

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=\$BAR"
EOF

এই ক্ষেত্রে আপনার ssh কমান্ড (রিমোট সার্ভার দ্বারা প্রাপ্ত হিসাবে) নিম্নলিখিত হবে:

  BAR="bar"
  echo "FOO=foo"
  echo "BAR=$BAR"

1
ঐটা অসাধারণ! আমি এটি বুঝতে চেষ্টা করে যুগে যুগে সময় কাটিয়েছি। এই সমাধানের জন্য আপনাকে অনেক ধন্যবাদ।
ট্রুবলিফোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.