বাশ স্ক্রিপ্টে সোর্স করার সময় ভেরিয়েবলগুলি পাস করা


18

ধরা যাক আমার মূল অংশ আছে:

$NAME="a string"
if [ -f $HOME/install.sh ]
    . $HOME/install.sh $NAME
fi

এবং install.sh এ:

echo $1

এটি প্রতিধ্বনিত হওয়ার কথা "a string", তবে এটি কিছুই প্রতিধ্বনিত করে না। কেন?


2
দয়া করে প্রশ্নটি আপডেট করবেন না। এইভাবে আমরা দেখতে পাচ্ছি না যে আপনার প্রাথমিক প্রশ্নের মধ্যে কী ভুল ছিল। আমি শুধু এটি পিছনে ঘুরিয়ে।
ভ্যালেন্টাইন বাজরামি

উত্তর:


20

মাইকেল মরোজেক বেশিরভাগ ইস্যুগুলি কভার করে এবং আপনি বাশ ব্যবহার করার পরে তার সমাধানগুলি কার্যকর হবে।

আপনার পক্ষে আগ্রহী হতে পারে যে যুক্তিযুক্ত একটি স্ক্রিপ্ট উত্সকরণের ক্ষমতা বাশিজম। ইন shবা dashআপনার main.shইচ্ছা না কিছু echo কারণ সোর্সড স্ক্রিপ্ট আর্গুমেন্ট উপেক্ষা করা হয় এবং $1আর্গুমেন্ট প্রাপ্ত করতে পড়ুন হবেmain.sh.

আপনি যখন স্ক্রিপ্টটি উত্স করেছেন sh, তখন মনে হয় আপনি সসিস্কৃত স্ক্রিপ্টটির পাঠ্যটি যে ফাইল থেকে সসার করা হয়েছিল সেটিতে এটি অনুলিপি করে আটকে দিয়েছেন। নিম্নলিখিতগুলি বিবেচনা করুন (দ্রষ্টব্য, আমি মাইকেলকে প্রস্তাবিত সংশোধন করেছি):

$ bash ./test.sh
A String
$ sh ./test.sh

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD

"Sh বা ড্যাশ এ আপনার মূল.শ কিছুই প্রতিধ্বনিত হবে না কারণ উত্সাহিত স্ক্রিপ্টের যুক্তি উপেক্ষা করা হয় এবং $ 1 আর্গুমেন্টটিকে মেইন.শকে নির্দেশ করবে" ঠিক এটিই ঘটছে। উত্তর করার জন্য ধন্যবাদ.
এখনও কেউ আপনাকে এমএস-ডস

আমি আপনাকে উত্তর হিসাবে স্বীকৃত হিসাবে চিহ্নিত করেছি, কারণ আসল সমস্যাটি আমার স্ক্রিপ্টের ত্রুটিগুলির সাথে নয়, তবে মূলত কারণ আমি শের সাথে ব্যাশের সাথে সমান করেছি, এবং এই পরিস্থিতিতে শেশ অনুকরণ করার ক্ষেত্রে বাশ খুব খারাপ কাজ করে না। আপনার উত্তর আমাকে এই বিষয়টি সম্পর্কে আলোকিত করেছিল, ধন্যবাদ;
এখনও কেউ আপনাকে এমএস-ডস

2
টেকনিক্যালি, এটি এখানে আরও খাসিজম (ইতিমধ্যে সম্ভবত এখানে আগে ksh86 এ রয়েছে)। @ সাম্বোডিস্টিলুসিউইউএমএস-ডস, "শ" স্পেসিফিকেশনটি আপনাকে অতিরিক্ত যুক্তি পাস করলে কী হবে তা বলে না, সুতরাং ড্যাশ বা বাশ আচরণ অন্যের তুলনায় আর "sh" নয় এবং সমানভাবে বৈধ।
স্টাফেন চেজেলাস

16

আমি তিনটি ত্রুটি দেখতে পাচ্ছি:

  1. আপনার অ্যাসাইনমেন্ট লাইনটি ভুল:

    $NAME="a string"

    আপনি যখন কোনও ভেরিয়েবলকে অর্পণ করেন আপনি এতে অন্তর্ভুক্ত করবেন না $; এটা করা উচিত:

    NAME="a string"
  2. আপনি অনুপস্থিত then; শর্তসাপেক্ষ রেখাটি হওয়া উচিত:

    if [ -f $HOME/install.sh ]; then
  3. $NAMEস্পেস থাকলেও আপনি উদ্ধৃতি দিচ্ছেন না । উত্স রেখাটি হওয়া উচিত:

    . $HOME/install.sh "$NAME"

তাঁর আরও কয়েকটি ত্রুটি রয়েছে, তবে আমি মনে করি না যে এগুলি যে সমস্যাটি সামনে এনেছে তা অগত্যা the
স্টিভেন ডি

@ স্টিভেন আপনি ঠিক বলেছেন, আরও দু'জন ছিল আমি উল্লেখ করি নি; আমি এখনই তালিকাভুক্ত ফিক্সগুলি নিয়ে এটি আমার পক্ষে কাজ করে
মাইকেল মরোজেক

@ স্টিভেন যখন চেষ্টা করার জন্য আমি স্ক্রিপ্টটি একসাথে ছুঁড়েছিলাম তখন আমি এটিকে সংক্ষেপে বলেছি [ -f $HOME/install.sh ] && . $HOME/install.sh $NAME; আমি যখন ত্রুটিগুলি খুঁজছি তখন আমার সম্ভবত এমন কাজ করা উচিত নয়
মাইকেল মরোজেক

দেখে মনে হচ্ছে যে অন্যান্য সমস্যাটি আমি ভেবেছিলাম সেখানে আসলেই কোনও সমস্যা নেই কারণ তিনি বিশেষত BASH উল্লেখ করেছেন।
স্টিভেন ডি

5

স্ক্রিপ্ট উত্সাহ দেওয়ার আগে কেবল আপনার প্যারামিটার সেট করুন!

main.sh

#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
    set -- $NAME ;
    . install.sh ;
fi
exit;

install.sh

#!/bin/bash
echo  " i am sourced by [ ${0##*/} ]";
echo  " with [ $@ ] as parametr(s) ";
exit;

পরীক্ষা

u@h$ ./main.sh some args
 i am sourced by [ main.sh ]
 with [ some args ] as parametr(s) 
u@h$

আপনি কীভাবে পতাকা সেট করবেন?
জোনাথন ল্যান্ড্রাম

সম্পাদনা করুন: আপনি দৃশ্যত ঠিক --যেমন কমান্ড যুক্তি দেখিয়েছিলেন তার পরে তাদের স্ট্রিং করুন :set -- -v foo -l bar -j "${bin}"
জোনাথন ল্যান্ড্রাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.