जवाबों:
फेडोरक्वि के सही उत्तर के अलावा , मैं स्ट्रिंग लंबाई और बाइट लंबाई के बीच का अंतर दिखाना चाहूंगा:
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 पर एक नज़र डालें ।
एक चर में संग्रहीत स्ट्रिंग की लंबाई प्राप्त करने के लिए, कहें:
myvar="some string"
size=${#myvar}
इसकी पुष्टि करने के लिए इसे ठीक से सहेजा गया था echo
:
$ echo "$size"
11
$rulename
जो $RULE_PREFIX
उपसर्ग के साथ शुरू होता है : [ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
और {#myvar}
?
${#parameter}
: पैरामीटर के विस्तारित मूल्य के पात्रों में लंबाई प्रतिस्थापित है ।
आप उपयोग कर सकते हैं:
MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
wc -c
या wc --bytes
बाइट काउंट्स के लिए = यूनिकोड वर्णों को 2, 3 या अधिक बाइट्स के साथ गिना जाता है।wc -m
या wc --chars
वर्ण गणना के लिए = यूनिकोड वर्णों को तब तक गिना जाता है जब तक वे अधिक बाइट का उपयोग नहीं करते हैं।mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
जबकि स्वीकृत समाधान विफल हो जाता है और आपको myvar=$HOME/.ssh
पहले की आवश्यकता होती है ।
मैं सबसे सरल मामला चाहता था, आखिरकार यह एक परिणाम है:
echo -n 'Tell me the length of this sentence.' | wc -m;
36
echo '' | wc -m
=>> 1
आपको उपयोग करने की आवश्यकता होगी -n
: echo -n '' | wc -m
=>। 0
... किस मामले में यह एक अच्छा समाधान है :)
-n do not output the trailing newline
यदि आप इसका उपयोग कमांड लाइन या फ़ंक्शन आर्गुमेंट्स के साथ करना चाहते हैं, तो सुनिश्चित करें कि आप size=${#1}
इसके बजाय उपयोग करते हैं size=${#$1}
। दूसरा एक अधिक सहज हो सकता है लेकिन गलत वाक्यविन्यास है।
size=${#1}
निश्चित रूप से मान्य है।
#
की जगह नहीं है $
- $
ब्रेसिज़ के बाहर अभी भी विस्तार ऑपरेटर है। #
लंबाई ऑपरेटर, हमेशा की तरह है।
पोस्ट शुरू होने के जवाब में:
यदि आप इसे कमांड लाइन या फ़ंक्शन तर्क के साथ उपयोग करना चाहते हैं ...
कोड के साथ:
size=${#1}
ऐसा मामला हो सकता है जहां आप केवल एक शून्य लंबाई तर्क की जांच करना चाहते हैं और एक चर को संग्रहीत करने की कोई आवश्यकता नहीं है। मेरा मानना है कि आप इस प्रकार के वाक्य रचना का उपयोग कर सकते हैं:
if [ -z "$1" ]; then
#zero length argument
else
#non-zero length
fi
बश सशर्त अभिव्यक्तियों की एक पूरी सूची के लिए GNU और ऊनीज देखें ।
दिए गए अपने उदाहरण का उपयोग करना
#KISS (Keep it simple stupid)
size=${#myvar}
echo $size
चर की लंबाई की गणना करने के कुछ तरीके यहां दिए गए हैं:
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