एक अंडरस्कोर के साथ दो चर को समेटना


54

मैं एक अंडरस्कोर है कि एक फ़ाइल नाम बनाने के लिए दो चर को संक्षिप्त करने की जरूरत है। चलो मेरे चर कहते हैं $FILENAMEऔर $EXTENSIONफ़ाइल से फ़ाइल नाम पढ़ा जाता है।

FILENAME=Hello
EXTENSION=WORLD.txt

अभी...

मैंने सफलता के बिना निम्नलिखित कोशिश की है:

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

मुझे हमेशा किसी तरह का अजीब आउटपुट मिलता है। आमतौर पर पहले अंडरस्कोर।

मुझे इसकी आवश्यकता है

echo $NAME
Hello_WORLD.txt

2
संभवत: आपकी स्क्रिप्ट में कैरेज रिटर्न कैरेक्टर होते हैं।
स्टीफन चेजलस

हाँ, यह था। : डी
रिहुक

जवाबों:


67

आप कुछ इस तरह का उपयोग कर सकते हैं:

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

यह भी काम करता है:

NAME=${FILENAME}_${EXTENSION}

1
समस्या वह फ़ाइल थी जहाँ मैं NAME से पढ़ रहा था। Windows स्वरूपण ... आपके समाधान ने उसके बाद बहुत अच्छा काम किया। धन्यवाद
Rhyuk

2
पहला कमांड चर का मान और एक कमांड प्रतिस्थापन का उपयोग करता है और echoसंभवतः मदद नहीं कर सकता है। प्रश्न में दूसरी कमांड पहले से दी गई थी।
गिल्स एसओ- बुराई को रोकना '

1
हाँ! मुझे यह पसंद है। यह मुझे सबसे लंबे समय तक परेशान कर रहा था। समाधान के लिए धन्यवाद!
racl101

यह मेरे लिए काम करता है। जब मैं '$ FILENAME_ $ EXTENSION' का उपयोग करता हूं, तो '$ EXTENSION' के केवल मान दिखाई देते हैं। क्या आप यह समझाने में मदद कर सकते हैं कि ऐसा क्यों होता है? धन्यवाद
Lei Hao

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}

के रूप में _(के विपरीत \या ') एक चर नाम में मान्य वर्ण नहीं है।

आपकी समस्या यह है कि आपके पास केवल LF के बजाय CRLF के साथ सीमांकित लाइनें थीं, जिसका मतलब था कि उन चर सामग्री सीआर चरित्र में समाप्त हो गई थी।

सीआर वर्ण, जब टर्मिनल को लिखा जाता है, तो टर्मिनल को कर्सर को लाइन की शुरुआत में ले जाने के लिए कहता है। तो Hello<CR>_WORLD.TXT<CR>जब एक टर्मिनल के लिए भेजा _WORLD.TXT(ओवरराइडिंग Hello) के रूप में दिखाएगा ।


1

मैंने ${FILENAME}_${EXTENSION}ऊपर उल्लिखित वाक्यविन्यास का उपयोग करने के लिए स्विच किया है।

$()जब मैं एक अंडरस्कोर के साथ दो चर को समेटने की आवश्यकता होती है तो मैं उपयोग करता था । उदाहरण के लिए, $YYYYMMDD$()_$HHMMSSYYYYMMDD_HHMMSS के प्रारूप में टाइमस्टैम्प वाला फ़ाइल नाम उत्पन्न करना। मध्य $()कुछ भी नहीं देता है और दो चरों को अलग करता है।

मैंने विधि और उनमें से कुछ का timeउपयोग करके असाइनमेंट को मापने के लिए उपयोग किया $YYYYMMDD$()_$HHMMSSहै, और वे सभी पुराने सर्वर पर 0ms की रिपोर्ट कर रहे हैं जो मैं इस पर उपयोग कर रहा हूं। प्रदर्शन एक मुद्दा नहीं लगता है।


इस सवाल का जवाब नहीं है। आपको उसके लिए एक नया सवाल उठाना चाहिए। $()कुछ गोले में एक उपखंड कांटा (कुछ इसे दूर अनुकूलन)। यह किसी ऐसी चीज़ के लिए एक ऑपरेटर का अपहरण भी कर रहा है जिसे इसके लिए डिज़ाइन नहीं किया गया है। ${x}_yतुम क्या चाहते हो
स्टीफन चेज़लस

आपका क्या मतलब है, "यह सवाल का जवाब नहीं देता है।" यह एक महान जवाब नहीं है, लेकिन यह एक जवाब है।
स्कॉट

अस्पष्टता को दूर करने का संपादन किया।
user208145

0

आपको लोअरकेस में चर का उपयोग करना चाहिए (यह सबसे अच्छा अभ्यास है)।
तो, मैं FILENAME और EXTENSION के बजाय फ़ाइल नाम और एक्सटेंशन का उपयोग करूंगा

जैसा कि आप कहते हैं कि "फ़ाइल नाम फ़ाइल से पढ़ा जाता है", मैं मानूंगा कि स्क्रिप्ट है:

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, bash, 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भले ही अन्य vars नियंत्रण वर्णों के लिए सही मान प्राप्त करेंगे ।



-2

आप इसका उपयोग भी कर सकते हैं: रिक्त स्थान के साथ अलग-अलग vars को अलग करें और अंतरिक्ष को हटाने के लिए tr का उपयोग करके उन्हें अलग करें।

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"

(१) इस प्रश्न का पहले ही पर्याप्त से अधिक उत्तर दिया जा चुका है। (२) यदि मौजूदा चर में विशेष वर्ण हैं तो आपका जवाब क्या है?
जी-मैन

यह चर वापसी वाले चर के साथ समस्या को संबोधित नहीं करता है। यह रिक्त स्थान को भी हटा देता है, कुछ ऐसा जो नहीं चाहता है।
Kusalananda

@ कुसलानंद: वास्तव में, जब तक मैं किसी चीज़ की अनदेखी नहीं कर रहा हूँ, तब तक गाड़ी वापस आना ठीक है; रिक्त स्थान ही समस्या है।
जी-मैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.