बाश में स्ट्रिंग की लंबाई


428

आपको एक चर में संग्रहीत स्ट्रिंग की लंबाई कैसे मिलती है और इसे दूसरे चर पर असाइन किया जाता है?

myvar="some string"
echo ${#myvar}  
# 11

आप आउटपुट में दूसरा चर कैसे सेट करते हैं 11?

जवाबों:


270

UTF-8 स्ट्रिंग की लंबाई

फेडोरक्वि के सही उत्तर के अलावा , मैं स्ट्रिंग लंबाई और बाइट लंबाई के बीच का अंतर दिखाना चाहूंगा:

myvar='Généralités'
chrlen=${#myvar}
oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#myvar}
LANG=$oLang LC_ALL=$oLcAll
printf "%s is %d char len, but %d bytes len.\n" "${myvar}" $chrlen $bytlen

प्रस्तुत करना होगा:

Généralités is 11 char len, but 14 bytes len.

तुम भी संग्रहीत आकर्षण पर एक नज़र हो सकता है:

myvar='Généralités'
chrlen=${#myvar}
oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#myvar}
printf -v myreal "%q" "$myvar"
LANG=$oLang LC_ALL=$oLcAll
printf "%s has %d chars, %d bytes: (%s).\n" "${myvar}" $chrlen $bytlen "$myreal"

जवाब देंगे:

Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s').

नोट: इसाबेल कोवान की टिप्पणी के अनुसार , मैंने सेटिंग को $LC_ALLसाथ जोड़ा है $LANG

एक तर्क की लंबाई

तर्क नियमित चर के समान कार्य करता है

strLen() {
    local bytlen sreal oLang=$LANG oLcAll=$LC_ALL
    LANG=C LC_ALL=C
    bytlen=${#1}
    printf -v sreal %q "$1"
    LANG=$oLang LC_ALL=$oLcAll
    printf "String '%s' is %d bytes, but %d chars len: %s.\n" "$1" $bytlen ${#1} "$sreal"
}

के रूप में काम करेगा

strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'

उपयोगी printfसुधार उपकरण:

अगर तुम:

for string in Généralités Language Théorème Février  "Left: ←" "Yin Yang ☯";do
    printf " - %-14s is %2d char length\n" "'$string'"  ${#string}
done

 - 'Généralités' is 11 char length
 - 'Language'     is  8 char length
 - 'Théorème'   is  8 char length
 - 'Février'     is  7 char length
 - 'Left: ←'    is  7 char length
 - 'Yin Yang ☯' is 10 char length

वास्तव में सुंदर नहीं है ... इसके लिए, एक छोटा सा कार्य है:

strU8DiffLen () { 
    local bytlen oLang=$LANG oLcAll=$LC_ALL
    LANG=C LC_ALL=C
    bytlen=${#1}
    LANG=$oLang LC_ALL=$oLcAll
    return $(( bytlen - ${#1} ))
}

तो अब:

for string in Généralités Language Théorème Février  "Left: ←" "Yin Yang ☯";do
    strU8DiffLen "$string"
    printf " - %-$((14+$?))s is %2d chars length, but uses %2d bytes\n" \
        "'$string'" ${#string} $((${#string}+$?))
  done 

 - 'Généralités'  is 11 chars length, but uses 14 bytes
 - 'Language'     is  8 chars length, but uses  8 bytes
 - 'Théorème'     is  8 chars length, but uses 10 bytes
 - 'Février'      is  7 chars length, but uses  8 bytes
 - 'Left: ←'      is  7 chars length, but uses  9 bytes
 - 'Yin Yang ☯'   is 10 chars length, but uses 12 bytes

दुर्भाग्य से, यह सही नहीं है!

लेकिन कुछ अजीब यूटीएफ -8 व्यवहार को छोड़ दिया, जैसे कि डबल-स्पेस्ड चार्ज़, ज़ीरो स्पेसेड चार्ज़, रिवर्स डेप्लेमेंट और अन्य जो सरल नहीं हो सकते थे ...

अधिक सीमाओं के लिए diffU8test.sh या diffU8test.sh.txt पर एक नज़र डालें ।


मैं इस जवाब की सराहना करता हूं, क्योंकि फाइल सिस्टम बाइट्स में नाम की सीमाएं लगाता है और चरित्र नहीं।
Gid

1
आपको LC_ALL = C और शायद अन्य को भी सेट करना पड़ सकता है।
इसाबेल कोवान

1
@ F.Hauri लेकिन, यह किसी से कम नहीं है कि कुछ प्रणालियों पर आपका समाधान काम नहीं करेगा, क्योंकि यह LC_ALL को अकेला छोड़ देता है। यह डेबियन के डिफ़ॉल्ट इंस्टॉल्स पर ठीक काम कर सकता है और यह डेरिवेटिव है, लेकिन दूसरों पर (आर्क लिनक्स की तरह) यह स्ट्रिंग की सही बाइट लंबाई देने में विफल होगा।
इसाबेल कोवान

1
कुछ सरल लेने और इसे
समझाने

2
@thistleknot मुझे क्षमा करें, ist कुछ समय के लिए सरल केवल एक विचार है।
एफ। हौरी

474

एक चर में संग्रहीत स्ट्रिंग की लंबाई प्राप्त करने के लिए, कहें:

myvar="some string"
size=${#myvar} 

इसकी पुष्टि करने के लिए इसे ठीक से सहेजा गया था echo:

$ echo "$size"
11

8
UTF-8 स्टिंग के साथ, आप एक स्ट्रिंग लंबाई और बाइट्स लंबाई हो सकते हैं। मेरा जवाब देखें
F. Hauri

आप इसे सीधे अन्य पैरामीटर विस्तार में भी उपयोग कर सकते हैं - उदाहरण के लिए इस परीक्षण में मैं जांच करता हूं $rulenameजो $RULE_PREFIXउपसर्ग के साथ शुरू होता है : [ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
थॉमस गयोट-सायननेस्ट

आप थोड़ा के भाव समझाने कृपया सकते हैं #myvarऔर {#myvar}?
लर्नर जांग

1
@lerneradams बैश संदर्भ मैनुअल → 3.5.3 शैल पैरामीटर विस्तार देखें ${#parameter}: पैरामीटर के विस्तारित मूल्य के पात्रों में लंबाई प्रतिस्थापित है
फेडोरक्वी 'एसओ

25

आप उपयोग कर सकते हैं:

MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
  • wc -cया wc --bytesबाइट काउंट्स के लिए = यूनिकोड वर्णों को 2, 3 या अधिक बाइट्स के साथ गिना जाता है।
  • wc -mया wc --charsवर्ण गणना के लिए = यूनिकोड वर्णों को तब तक गिना जाता है जब तक वे अधिक बाइट का उपयोग नहीं करते हैं।

4
-c बाइट्स के लिए है। -एम चार्लीज के लिए है। gnu.org/software/coreutils/manual/html_node/wc-invocation.html pubs.opengroup.org/onlinepubs/009604499/utilities/wc.html
LLFourn

3
गंभीरता से? एक पाइप, एक उप-प्रकार और कुछ के लिए एक बाहरी कमांड जो तुच्छ है?
gourourf_gniourf

यह कुछ इस तरह से संभालता है mylen=$(printf "%s" "$HOME/.ssh" | wc -c)जबकि स्वीकृत समाधान विफल हो जाता है और आपको myvar=$HOME/.sshपहले की आवश्यकता होती है ।
JL Peyret

23

मैं सबसे सरल मामला चाहता था, आखिरकार यह एक परिणाम है:

echo -n 'Tell me the length of this sentence.' | wc -m;
36

4
क्षमा करें दोस्त :( यह मार है ... शापित हथौड़ा जो एक नाखून के रूप में सब कुछ देखता है, विशेष रूप से आपके अंगूठे। 'मुझे इस वाक्य की लंबाई बताओ।' में 36 वर्ण हैं। echo '' | wc -m=>> 1आपको उपयोग करने की आवश्यकता होगी -n: echo -n '' | wc -m=>। 0... किस मामले में यह एक अच्छा समाधान है :)
AJP

1
सुधारों के लिए धन्यवाद! मैनुअल पेज कहता है: -n do not output the trailing newline
dmatej

17

यदि आप इसका उपयोग कमांड लाइन या फ़ंक्शन आर्गुमेंट्स के साथ करना चाहते हैं, तो सुनिश्चित करें कि आप size=${#1}इसके बजाय उपयोग करते हैं size=${#$1}। दूसरा एक अधिक सहज हो सकता है लेकिन गलत वाक्यविन्यास है।


14
"आप कर सकते हैं <अमान्य सिंटैक्स>" के साथ समस्या का एक हिस्सा यह है कि, सिंटैक्स अमान्य है, यह स्पष्ट नहीं है कि एक पाठक को इसका क्या मतलब निकालना चाहिए। size=${#1}निश्चित रूप से मान्य है।
चार्ल्स डफी

खैर, यह अप्रत्याशित है। मुझे नहीं पता था कि इस मामले में # 1 $ 1 का विकल्प था।
डिक गुर्टिन

16
यह नहीं है। #की जगह नहीं है $- $ब्रेसिज़ के बाहर अभी भी विस्तार ऑपरेटर है। #लंबाई ऑपरेटर, हमेशा की तरह है।
चार्ल्स डफी

मैंने यह उत्तर निर्धारित किया है क्योंकि यह एक उपयोगी टिप है, लेकिन नियम का अपवाद नहीं है - यह नियम का ठीक उसी प्रकार अनुसरण करता है, जैसा @CharlesDuffy द्वारा बताया गया
Zane Hooper

16

पोस्ट शुरू होने के जवाब में:

यदि आप इसे कमांड लाइन या फ़ंक्शन तर्क के साथ उपयोग करना चाहते हैं ...

कोड के साथ:

size=${#1}

ऐसा मामला हो सकता है जहां आप केवल एक शून्य लंबाई तर्क की जांच करना चाहते हैं और एक चर को संग्रहीत करने की कोई आवश्यकता नहीं है। मेरा मानना ​​है कि आप इस प्रकार के वाक्य रचना का उपयोग कर सकते हैं:

if [ -z "$1" ]; then
    #zero length argument 
else
    #non-zero length
fi

बश सशर्त अभिव्यक्तियों की एक पूरी सूची के लिए GNU और ऊनीज देखें ।


11

दिए गए अपने उदाहरण का उपयोग करना

#KISS (Keep it simple stupid)
size=${#myvar}
echo $size

9

चर की लंबाई की गणना करने के कुछ तरीके यहां दिए गए हैं:

echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'

और परिणाम को दूसरे चर में सेट करने के लिए, ऊपर दिए गए उद्धरण के साथ कमांड को निम्नलिखित के रूप में दूसरे चर में निर्दिष्ट करें:

otherVar=`echo -n $VAR | wc -m`   
echo $otherVar

http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.