উত্তর:
ফেডোরকিয়ার সঠিক উত্তর ছাড়াও , আমি স্ট্রিং দৈর্ঘ্য এবং বাইট দৈর্ঘ্যের মধ্যে পার্থক্যটি দেখাতে চাই:
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').
নোট: মতে Isabell কাওয়ান এর মন্তব্য , আমি সেটিং জুড়েছেন $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}
অবশ্যই বৈধ।
#
প্রতিস্থাপন করছে না $
- $
বাইরের ধনুর্বন্ধনী এখনও প্রসারণ অপারেটর is #
দৈর্ঘ্য অপারেটর, সবসময় হয়।
পোস্টটি শুরু হওয়ার জবাবে:
আপনি যদি কমান্ড লাইন বা ফাংশন যুক্তি দিয়ে এটি ব্যবহার করতে চান ...
কোড সহ:
size=${#1}
এমন একটি ক্ষেত্রে থাকতে পারে যেখানে আপনি কেবল একটি শূন্য দৈর্ঘ্যের যুক্তিটি পরীক্ষা করতে চান এবং ভেরিয়েবল সংরক্ষণ করার দরকার নেই no আমি বিশ্বাস করি আপনি এই ধরণের সিনট্যাক্স ব্যবহার করতে পারেন:
if [ -z "$1" ]; then
#zero length argument
else
#non-zero length
fi
জিএনইউ দেখুন এবং বাশ শর্তসাপেক্ষ এক্সপ্রেশনগুলির আরও সম্পূর্ণ তালিকার জন্য ওয়াজ করুন ।
আপনার দেওয়া উদাহরণ ব্যবহার করে
#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