Differences between revisions 4 and 16 (spanning 12 versions)
Revision 4 as of 2009-06-09 13:19:16
Size: 678
Editor: localhost
Comment: its about length.. it should also bring examples for arrays
Revision 16 as of 2015-03-05 00:24:26
Size: 1522
Editor: izabera
Comment: syntax hl
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
The fastest way, not requiring external programs (but usable only with [[BASH]] and KornShell): The fastest way, not requiring external programs (but not usable in Bourne shells):
Line 5: Line 5:
{{{
${#varname}
{{{#!highlight bash
# POSIX
"
${#varname}"
Line 8: Line 9:

(note that with `bash` 3 and above, that's the number of characters, not bytes, which is a significant differences in multi-byte locales. Behaviour of other shells in that regard vary).
Line 11: Line 14:
{{{
expr "$varname" : '.*'
{{{#!highlight bash
# Bourne

expr "x$varname" : '.*' - 1
Line 15: Line 19:
({{{expr}}} prints the number of characters matching the pattern {{{.*}}}, which is the length of the string.) ({{{expr}}} prints the number of characters or bytes matching the pattern {{{.*}}}, which is the length of the string (in bytes for GNU `expr`). The `x` is necessary to avoid problems with `$varname` values that are `expr` operators)
Line 17: Line 21:
Another one: or:
Line 19: Line 23:
{{{
expr length "$varname"
{{{#!highlight bash
# Bourne, with GNU expr(1)

expr length "x$varname" - 1
Line 23: Line 28:
(This is for a BSD/GNU version of {{{expr}}}. Do not use this, because it is not [[POSIX]]). (BSD/GNU {{{expr}}} only)
Line 25: Line 30:
{{{
${#arrayname[@]}
This second version is not specified in [[POSIX]], so is not portable across all platforms.

One may also use `awk`:

{{{#!highlight bash
# Bourne with POSIX awk
awk 'BEGIN {print length(ARGV[1])}' "$varname"
Line 29: Line 39:
Returns the Number of Elements in an Array. (there, whether the length is expressed in bytes or characters depends on the implementation (for instance, it's ''characters'' for GNU awk, but ''bytes'' for `mawk`).
------
Line 31: Line 42:
{{{
${#arrayname[i]}
Similar needs:

{{{#!highlight bash
# Korn/Bash
"${#arrayname[@]}"
Line 35: Line 49:
Returns the length of the Arrays Element i. Expands to the number of elements in an array.

{{{#!highlight bash
# Korn/Bash
"${#arrayname[i]}"
}}}

Expands to the length of the array's element i.

----
CategoryShell

Is there a function to return the length of a string?

The fastest way, not requiring external programs (but not usable in Bourne shells):

   1 # POSIX
   2 "${#varname}"

(note that with bash 3 and above, that's the number of characters, not bytes, which is a significant differences in multi-byte locales. Behaviour of other shells in that regard vary).

or for Bourne shells:

   1 # Bourne
   2 expr "x$varname" : '.*' - 1

(expr prints the number of characters or bytes matching the pattern .*, which is the length of the string (in bytes for GNU expr). The x is necessary to avoid problems with $varname values that are expr operators)

or:

   1 # Bourne, with GNU expr(1)
   2 expr length "x$varname" - 1

(BSD/GNU expr only)

This second version is not specified in POSIX, so is not portable across all platforms.

One may also use awk:

   1 # Bourne with POSIX awk
   2 awk  'BEGIN {print length(ARGV[1])}' "$varname"

(there, whether the length is expressed in bytes or characters depends on the implementation (for instance, it's characters for GNU awk, but bytes for mawk).


Similar needs:

   1 # Korn/Bash
   2 "${#arrayname[@]}"

Expands to the number of elements in an array.

   1 # Korn/Bash
   2 "${#arrayname[i]}"

Expands to the length of the array's element i.


CategoryShell

BashFAQ/007 (last edited 2015-03-05 00:24:26 by izabera)