আন্ডারস্কোর দিয়ে দুটি ভেরিয়েবল কনটেনেট করা


54

আন্ডারস্কোরযুক্ত একটি ফাইল নাম তৈরি করতে আমার দুটি ভেরিয়েবলকে যুক্ত করতে হবে। আমার ভেরিয়েবলগুলিকে কল করতে দেয় $FILENAMEএবং $EXTENSIONযেখানে কোনও ফাইল থেকে ফাইলের নাম পড়া হয়।

FILENAME=Hello
EXTENSION=WORLD.txt

এখন ...

আমি সাফল্য ছাড়াই নিম্নলিখিত চেষ্টা করেছি:

NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION

আমি সবসময় একরকম অদ্ভুত আউটপুট পাই। সাধারণত প্রথমে আন্ডারস্কোর।

আমার এটা হওয়া দরকার

echo $NAME
Hello_WORLD.txt

2
সম্ভবত আপনার স্ক্রিপ্টে ক্যারেজ রিটার্নের অক্ষর রয়েছে।
স্টাফেন চেজেলাস

হ্যাঁ এটা ছিল। : ডি
র্যুক

উত্তর:


66

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

NAME=$(echo ${FILENAME}_${EXTENSION})

এটি পাশাপাশি কাজ করে:

NAME=${FILENAME}_${EXTENSION}

1
সমস্যাটি সেই ফাইলটি ছিল যেখানে আমি NAMEs পড়ছিলাম। উইন্ডোজ ফর্ম্যাটিং ... এর পরে আপনার সমাধান দুর্দান্ত কাজ করেছে। ধন্যবাদ
Rhyuk

2
প্রথম কমান্ডটি ভেরিয়েবলের মান এবং একটি কমান্ড প্রতিস্থাপনের ব্যবহারকে প্রয়োগ করে এবং echoসম্ভবত সহায়তা করতে পারে না। দ্বিতীয় কমান্ডটি ইতিমধ্যে প্রশ্নে দেওয়া হয়েছিল।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
হ্যাঁ! আমি এটা ভালোবাসি. এটি দীর্ঘকাল আমাকে বিরক্ত করছিল। সমাধানের জন্য ধন্যবাদ!
racl101

এটি আমার জন্য কাজ করে। আমি যখন '$ FILENAME_ $ EXTENSION' ব্যবহার করি তখন কেবল '$ EXTENSION' এর মান উপস্থিত হয়। কেন আপনি এটি দয়া করে ব্যাখ্যা করতে সাহায্য করতে পারেন? ধন্যবাদ
লেই হাও

12

তোমার:

NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION

সব ঠিক আছে, তাই হবে:

NAME=${FILENAME}_${EXTENSION}
NAME=$FILENAME'_'$EXTENSION
NAME=$FILENAME\_$EXTENSION
NAME=$FILENAME"_$EXTENSION"

(কিন্তু অবশ্যই না NAME=$(echo ${FILENAME}_${EXTENSION}) যেমন এটি ব্যবহার করেecho এবং অপারেটর )।split+glob

NAME=$FILENAME_$EXTENSION

যেমনটি হত:

NAME=${FILENAME_}${EXTENSION}

যেমন _( \বা এর বিপরীতে ') একটি চলক নামের একটি বৈধ অক্ষর।

আপনার সমস্যাটি হ'ল আপনার কাছে কেবল এলএফের পরিবর্তে লাইনগুলি সিআরএলএফ দিয়ে সীমাবদ্ধ করা হয়েছে যার অর্থ সেই পরিবর্তনশীল সামগ্রী সিআর চরিত্রে শেষ হয়েছে।

সিআর অক্ষর, যখন একটি টার্মিনালে লিখিত হয় তখন টার্মিনালকে কার্সারটিকে লাইনের শুরুতে সরাতে বলে। সুতরাং Hello<CR>_WORLD.TXT<CR>যখন টার্মিনালে প্রেরণ করা হবে তখন এটি _WORLD.TXT(ওভাররাইডিং Hello) হিসাবে প্রদর্শিত হবে ।


1

আমি ${FILENAME}_${EXTENSION}উপরে উল্লিখিত সিনট্যাক্সটি ব্যবহার করতে স্যুইচ করেছি ।

$()যখন আমি যখন আন্ডারস্কোর দিয়ে দুটি ভেরিয়েবল যুক্ত করতে চাই তখন আমি ব্যবহার করতাম। উদাহরণস্বরূপ, $YYYYMMDD$()_$HHMMSSওয়াইওয়াইওয়াইএমএমডিডিএইচএমএমএসএস ফর্ম্যাটে টাইমস্ট্যাম্পযুক্ত ফাইলের নাম তৈরি করতে। মধ্যম $()কিছুই ফেরৎ এবং দুই ভেরিয়েবল পৃথক্ বিরতি।

আমি পদ্ধতিটি এবং উপরের কিছুগুলির timeসাহায্যে অ্যাসাইনমেন্টগুলি পরিমাপ করতে ব্যবহার $YYYYMMDD$()_$HHMMSSকরেছি এবং তারা পুরানো সার্ভারে 0 মিমি রিপোর্ট করেছে যা আমি এটি ব্যবহার করছি। পারফরম্যান্সটি কোনও সমস্যা বলে মনে হচ্ছে না।


যে প্রশ্নের উত্তর দেয় না। আপনার এটির জন্য একটি নতুন প্রশ্ন উত্থাপন করা উচিত। $()কয়েকটি শেলের মধ্যে একটি সাবশেল কাঁটাচামচ করে (কিছু এটি অপ্টিমাইজ করে)। এটি কোনও অপারেটরকে এমন কোনও কিছুর জন্য হাইজ্যাক করে যা এর জন্য ডিজাইন করা হয়নি। ${x}_yআপনি কি চান
স্টাফেন চেজেলাস

আপনার অর্থ কী, "এটি প্রশ্নের উত্তর দেয় না” " এটি একটি দুর্দান্ত উত্তর নয়, তবে এটি একটি উত্তর।
স্কট 19

অস্পষ্টতা অপসারণ করতে সম্পাদিত।
ব্যবহারকারী208145

0

আপনার ছোট হাতের অক্ষরে পরিবর্তনগুলি ব্যবহার করা উচিত (এটি সর্বোত্তম অনুশীলন)।
সুতরাং, আমি ফাইলের নাম এবং এক্সটেনশনটি FILENAME এবং এক্সটেনশনের পরিবর্তে ব্যবহার করব

আপনি যেমনটি বলেন যে "ফাইলের নাম ফাইল থেকে পড়া হয়", আমি ধরে নেব স্ক্রিপ্টটি হ'ল:

read -r filename  <file.txt
extension=World.txt

এবং আপনি যে উভয় ভেরিয়েবল - ফাইলনাম এবং $ এক্সটেনশানটিকে একটি আন্ডারস্কোর দিয়ে সংযুক্ত করতে চান _
আপনার প্রদত্ত উদাহরণগুলি (ব্যতীত: ডাবল নয় \) এখানে সঠিকভাবে কাজ করে:

name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension

অন্য কিছু হিসাবে:

name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"

সুতরাং, আপনার সমস্যাটি কীভাবে ভেরিয়েবলগুলি একসাথে লেগে থাকে তা নয়, তবে ভার্সের বিষয়বস্তুর সাথে। এটি ভাবা যুক্তিসঙ্গত বলে মনে হয়:

read -r filename  <file.txt

\rউইন্ডোজ ফাইল থেকে পড়লে ট্রেলিং ক্যারেজ রিটার্ন পড়বে।

একটি সহজ সমাধান (ksh, বাশ, zsh এর জন্য) হ'ল পঠনযোগ্য ভেরিয়েবল থেকে সমস্ত নিয়ন্ত্রণ অক্ষর মুছে ফেলা:

filename=${filename//[[:cntrl:]]/}

এটি ক্যারিজ রিটার্নযুক্ত একটি মান দিয়ে সিমুলেটেড করা যেতে পারে:

$ filename=$'Hello\r'
$ echo "starting<$filename>end"
>endting<Hello                       ### note the return to the start of line.
$ echo "starting<${filename//[[:cntrl:]]/}>end"
starting<Hello>end

বা, এর মান প্রতিস্থাপন filename:

$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end

উপসংহার।

তাই এটা:

name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"

nameঅন্যান্য ভার্সে নিয়ন্ত্রণের অক্ষর রয়েছে এমন কিছুর জন্য সঠিক মানটি পাবেন ।


0

স্টাফেন চেজেলাসের উত্তর ,

NAME=${FILENAME}_$EXTENSION

অবশ্যই, সেরা উত্তর এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। তবে, ব্যবহারকারী ২০৮১৪৫ এর উত্তরের চেতনায় , এখানে একটি বিকল্প রয়েছে:

UNDERSCORE='_'
NAME=$FILENAME$UNDERSCORE$EXTENSION

-2

আপনি এটিও ব্যবহার করতে পারেন: স্পেসগুলির সাথে পৃথক পৃথক ভারগুলি পৃথক করুন এবং স্থান অপসারণের জন্য ট্র ব্যবহার করে তাদের সাথে সংযুক্ত করুন।

TableNameToCreate="MyTable"
# concatenation work is done here 
$(echo "$TableNameToCreate _my_other_Info " | tr -d " ")

#Proof
echo "Var to create with var pasted as prefix to suffix
    $(echo "$TableNameToCreate _my_other_Info " | tr -d " ") 
. "

# create a new var
NewVar=$(echo "$TableNameToCreate _my_other_Info " | tr -d " ")

#proof
echo "$NewVar"

(1) এই প্রশ্নের ইতিমধ্যে পর্যাপ্ত পরিমাণের চেয়ে বেশি উত্তর দেওয়া হয়েছে। (২) বিদ্যমান ভেরিয়েবলটিতে বিশেষ অক্ষর থাকলে আপনার উত্তর কী করবে?
জি ম্যান

এটি ক্যারিজ রিটার্নযুক্ত ভেরিয়েবলের সাথে ইস্যুটির সমাধান করে না। এটি স্পেসগুলিও সরিয়ে দেয়, এমন কিছু যা চায় না।
কুসালানন্দ

@ কুসালানন্দ: আসলে, আমি যদি কিছু উপেক্ষা না করি তবে এই গাড়ি চালানো ঠিকঠাকই পরিচালনা করে; স্পেস একমাত্র সমস্যা।
জি ম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.