শেল পরিবর্তনশীল নামের একটি হাইফেন বা ড্যাশ (-) অন্তর্ভুক্ত করতে পারে?


38

আমি -শেলের ভেরিয়েবলগুলিতে ব্যবহার করতে সক্ষম নই । এটির ব্যবহারের পক্ষে থাকার কোনও উপায় আছে কেননা আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা এই জাতীয় নামকরণের ভেরিয়েবলের উপর নির্ভর করে:

$export a-b=c
-bash: export: `a-b=c': not a valid identifier

$export a_b=c

প্রথমে প্রদত্ত ত্রুটি এবং দ্বিতীয়টি সূক্ষ্মভাবে কাজ করে works


এর সম্ভাব্য ক্রস সাইটের সদৃশ: স্ট্যাকওভারফ্লো.
com/ জিজ্ঞাসা / ২২২১০৩৩/২

শেলগুলি সাধারণত এ জাতীয় পরিবর্তনশীল নামের অনুমতি দেয় না। আপনাকে শেলটি বাইপাস করতে হবে, সম্ভবত কোনও কাস্টম সি প্রোগ্রামের সাথে আপনার কোমন্ডের পরিবেশে ভেরিয়েবলগুলি লোড করা হবে। আপনি কি এই অপব্যবহার (এমনকি সম্ভাব্য সুরক্ষার ঝুঁকি) ঠিক করতে পারবেন না?
ভনব্র্যান্ড

উত্তর:


47

আমি কখনও বোর্ন-স্টাইলের শেলটি পূরণ করতে পারি নি যা -একটি চলক নামে অনুমোদিত । কেবলমাত্র ASCII অক্ষর (উভয় ক্ষেত্রে) _এবং অঙ্কগুলি সমর্থিত হয় এবং প্রথম অক্ষরটি অবশ্যই একটি অঙ্ক নয়।

আপনার যদি এমন একটি প্রোগ্রাম থাকে যার জন্য পরিবেশের পরিবর্তনশীল প্রয়োজন যা শেলের বিধিনিষেধের সাথে মেলে না, তবে envপ্রোগ্রামটি দিয়ে এটি চালু করুন।

env 'strange-name=some value' myprogram

মনে রাখবেন যে কয়েকটি শাঁস (যেমন আধুনিক ড্যাশ , ম্যাক্স, জেডএস) ভেরিয়েবলগুলি মুছে ফেলে যার নাম তারা পরিবেশ থেকে পছন্দ করে না। ( শেলশক পরিবেশের পরিবর্তনশীল নামগুলি সম্পর্কে মানুষকে আরও বেশি সতর্ক করতে বাধ্য করেছে, তাই বিধিনিষেধগুলি সময়ের সাথে সাথে আরও কঠোর হওয়ার সম্ভাবনা রয়েছে, আরও অনুমোদিত নয়)) সুতরাং আপনার যদি এমন কোনও ভেরিয়েবল পাস করতে হয় যার নামটিতে একটি প্রোগ্রামে বিশেষ চরিত্র থাকে তবে সরাসরি তা পাস করুন, মধ্যে শেল ছাড়াই ( env 'strange-name=some value' sh -c'…; myprogram'কাজ করতে পারে বা নাও পারে)


আর কাজ করে না।
জেসি গ্লিক

4
@ জেসিগ্লিক করুন হ্যাঁ এটি করে। (আপনার মন্তব্যটি কার্যকর হবে যদি আপনি "কাজ না করে" সংজ্ঞায়িত করেন: কোন ডেটা দিয়ে? কাঙ্ক্ষিত প্রভাবের পরিবর্তে কী প্রভাব রয়েছে? এবং আপনি যদি বলেছিলেন যে envকোন অপারেটিং সিস্টেমটিতে আপনার কোন
প্রয়োগায়ন

দুঃখিত। সমস্ত আপডেট সঙ্গে উবুন্টু Yakkety envথেকে coreutils, shথেকে dash: env 'with-dashes=value' bash -c 'env | fgrep dashes'কাজ কিন্তু env 'with-dashes=value' sh -c 'env | fgrep dashes'কপি করে প্রিন্ট কিছুই নেই। এটি হ'ল envনিজেই ভাল, তবে ড্যাশটি এই ভেরিয়েবলগুলিকে বিশেষভাবে ব্লক করে বলে মনে হচ্ছে। সুতরাং যদি প্রশ্নে থাকা প্রোগ্রামটি একটি শৈল র‍্যাপারের মাধ্যমে একটি আদর্শ #!/bin/shশিরোনাম দিয়ে চালু করা হয় , তবে এই ধরণের ভেরিয়েবলগুলিতে যাওয়ার কোনও আপাত উপায় নেই। উদাহরণস্বরূপ
জেসি গ্লিক

@ জেসিগ্লিক দ্যাট ড্যাশটি পরিবর্তনশীল অপসারণ করুন। envএই প্রোগ্রামটির কলিং সাইটের কাছাকাছি আপনাকে ব্যবহার করতে হবে যার মাঝে এই পরিবর্তনশীল নামটি দরকার, এর মধ্যে কোনও শেল ছাড়াই। যার নাম পছন্দ করে না এমন ভেরিয়েবলগুলি মুছে ফেলার জন্য ড্যাশ একা নয়।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
@ জেসিগ্লিক এটি সত্য যে কিছু জিনিস যা কাজ করত সেগুলি আর কাজ করে না, যদিও: শেলশক হওয়ার পরে , লোকেরা পরিবর্তনশীল নামগুলি সম্পর্কে আরও রক্ষণশীল হয়ে উঠেছে, এবং ড্যাশ বাস্তবে পরিবর্তিত হয়েছিল যেহেতু আমি এই উত্তরটি লিখেছি (যদিও শেলশকের ফলাফল হিসাবে নয়, তবে একই লাইন বরাবর একটি বাগ এড়ানোর জন্য)। আমি আমার উত্তরে একটি নোট যুক্ত করেছি।
গিলস 'এ-অশুভ হওয়া বন্ধ করুন'

15

বাশে এটি সম্ভব নয়।

এর ম্যানুয়াল পৃষ্ঠায় সংজ্ঞা বিভাগ থেকে bash:

নাম কেবলমাত্র বর্ণানুক্রমিক অক্ষর এবং আন্ডারস্কোর সমন্বিত একটি শব্দ, এবং বর্ণমালা অক্ষর বা আন্ডারস্কোর দিয়ে শুরু হয়। সনাক্তকারী হিসাবে উল্লেখ করা হয়।

এর ম্যানুয়াল পৃষ্ঠায় প্যারামিটার বিভাগ থেকে bash:

একটি পরামিতি একটি সত্তা যা মানগুলি সঞ্চয় করে। এটি নাম, একটি সংখ্যা বা বিশেষ প্যারামিটারগুলির নীচে তালিকাভুক্ত বিশেষ অক্ষরের একটি হতে পারে। একটি ভেরিয়েবল একটি প্যারামিটার যা নামের দ্বারা চিহ্নিত করা হয়।


2
আরও একবার ম্যান পেজগুলির কার্যকারিতা প্রদর্শনের জন্য +1
কেটিএফf

2
পুরাতন পোস্টটি আমি জানি তবে, আমি এটি উল্লেখ করতে চাই যে নতুনদের জন্য ম্যান পেজগুলি বেশ ক্রিপ্টিক হতে পারে। আমার এখনও আরও অনেক সময় আছে যখন আমার আরও ভাল ব্যাখ্যা / উদাহরণ সন্ধান করতে হবে। যে কেউ মিথ্যা বলবে যদি তারা বলে যে এটি তাদের সাথে কখনও হয় নি।
টিসিজেড 8

1
@ টিসিজেড 8 কেবলমাত্র লোকেরা যা আমাকে বলেছিল যে তারা মনে করেছিল যে ম্যান পেজগুলি 'ক্রিপ্টিক' ছিল একই ধরণের লোক যারা ত্রুটির বার্তা পড়েন না এবং কেবল যা পড়তে হবে তা বাদ দিয়ে সবকিছু পড়েন না।
মাইলস রুট

13

আপনি অপ্রত্যক্ষ রেফারেন্স ব্যবহার করে একটি হাইফেনেটেড ভেরিয়েবল অ্যাক্সেস করতে পারেন।

$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello

1
এই মন্তব্যটি পড়া না হওয়া পর্যন্ত আমি এই কার্যকারিতাটি কখনও শুনিনি the গ্রহণযোগ্য উত্তরের চেয়ে আমার পক্ষে অনেক সহজ সমাধান সরবরাহ করা হয়েছিল।
DrStrangepork

7
এই আচরণটি ব্যাশের নতুন সংস্করণগুলিতে অক্ষম করা হয়েছে। পরিস্থিতিটির বিশদ বিশ্লেষণের জন্য স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 69৯৯৯২২63৩/২ দেখুন ।
নিকোলাস ডুডবউট

6

যদি আপনার স্ক্রিপ্টে ভেরিয়েবলের নামগুলি হাইফেনের উপর নির্ভর করে তবে এটি প্রোগ্রামিং ত্রুটি। আপনি যদি ভেরিয়েবলের নামগুলিতে হাইফেন ধারণ করতে নিয়মিত যে সরঞ্জামগুলি ব্যবহার করেন সে কারণে এটি আপনার পক্ষে সুবিধাজনক হয় তবে আপনাকে আরও এবং বিভিন্ন সরঞ্জাম শিখতে হতে পারে।

হাইফেনগুলিকে আন্ডারস্কোরে রূপান্তর করতে আপনি কি ট্র ব্যবহার করে চেষ্টা করেছেন ?

hyphenated_name="a-b"
unhyphenated_name=$(echo $hyphenated_name | tr '-' '_')
declare -x $unhyphenated_name="some value"

বাশ '-' কে ফাংশনের নামগুলিতে উপস্থিত হতে দেয়। আমি সব সময় এটা করি। উদাহরণ স্বরূপ:

function foo-bar() {
   echo "$@"
}

2

ড্যাশ ( -) অক্ষরটি একটি বিরতিযুক্ত চরিত্র এবং চলক নামের অংশ হিসাবে অনুমোদিত নয়। উদ্ধৃত ভেরিয়েবলগুলি সহ এটি হ্যাক করার উপায় রয়েছে তবে এর পার্সিংটি সত্যই সমস্যাযুক্ত। ব্যাশে ভেরিয়েবল নামের প্রসঙ্গে বিশেষ অর্থ সহ অন্যান্য চরিত্রগুলিও রয়েছে, উল্লেখযোগ্যভাবে ব্রেস, প্রথম বন্ধনী, অপারেটর অক্ষর এবং উদ্ধৃতি। (উদাঃ {}()=+-&'"এবং আরও)

আমি আপনাকে পরামর্শ দেব যে কার্যত আপনার আরও একটি দৃষ্টান্ত খুঁজে বের করতে হবে যার ভিত্তিতে আপনার স্ক্রিপ্টটি তৈরি করা উচিত। "ভেরিয়েবল ভেরিয়েবলের নাম" সম্পর্কে আপনার অন্যান্য ভাষা থেকে ধারণা থাকতে পারে hang শেল স্ক্রিপ্টগুলিতে এটি সাধারণত ভাল ধারণা নয়।

আপনি যদি এটি সম্পাদনা করেন বা আপনার প্রসঙ্গে এবং আপনি কী অর্জন করতে চাইছেন তার বিবরণ সহ একটি নতুন প্রশ্ন জিজ্ঞাসা করুন আমরা সম্ভবত এটির স্ক্রিপ্টের একটি ভাল উপায় প্রস্তাব করতে সক্ষম হতে পারি।


2

বাশ ম্যানুয়ালটি একটি "নাম" হিসাবে সংজ্ঞায়িত করে:

একটি 'শব্দ' কেবলমাত্র অক্ষর, সংখ্যা এবং আন্ডারস্কোর সমন্বয়ে গঠিত হয় এবং একটি বর্ণ বা আন্ডারস্কোর দিয়ে শুরু হয়। নামগুলি শেল ভেরিয়েবল এবং ফাংশন নাম হিসাবে ব্যবহৃত হয়। একটি 'সনাক্তকারী' হিসাবে উল্লেখ করা হয়।

সুতরাং আপনি কোনও নামে হাইফেন ব্যবহার করতে পারবেন না।


0

বেশিরভাগ শেলগুলি কেবল ভেরিয়েবলের জন্য অ্যাজ, এজেড, 0-9 এবং _ সমর্থন করে। এই পৃষ্ঠায় দ্বিতীয় আইটেম পড়ুন ।


0

আপনি env এবং সেড সঙ্গে খেলতে পারেন।

উদাহরণ হিসাবে, আমার এই পরিবর্তনশীল 'ELASTICSEARCH_CLUSTER-NODES' পড়তে হবে।
Env কমান্ড এটি আউটপুট দেয়:

~ $ env
ELASTICSEARCH_CLUSTER-NODES=elasticsearch:9200
JAVA_ALPINE_VERSION=8.212.04-r0
HOSTNAME=17eb9e7fec4c
...

ভেরিয়েবলটি বের করতে:

ESHOST=`env | sed -n 's/ELASTICSEARCH_CLUSTER-NODES=\(.*\)/\1/p'`

-1

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

আপনার স্ক্রিপ্টটি এই ধরণের পরিবর্তনশীল নামের উপর নির্ভর না করার পরামর্শ দিচ্ছি।

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


-1

আপনি envহিফেনস "-" দিয়ে পরিবেশের ভেরিয়েবল সেট এবং আনসেট করতে কমান্ডটি ব্যবহার করতে পারেন ।

সেট করতে আপনি আপনার কমান্ড চালানোর জন্য env ব্যবহার করা আবশ্যক: env command। আপনি এইভাবে ভেরিয়েবলগুলি পাস করুন:

env a-b=c command

এটির সাথে কাজ করে দেখুন:

env a-b=c env

বা এটি আরও স্পষ্ট করতে:

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