关于变量:Bash:查找传递的所有参数的长度

Bash: To find length of all arguments passed

我想找出传递给脚本的所有参数的长度。如果我这样做:echo ${#1},我会看到我第一个论点的长度,如果我这样做:echo $*,我会看到我所有的论点都用空格隔开。那么,为什么不这样做呢:echo ${#*}?相反,这显示了传递的参数数量,就好像它是echo $#

有没有一种方法可以在不将$*值写入新变量($allargs=$*的情况下对总长度进行回声,然后检查新变量(echo ${#allargs}的长度)?


是的,最简单的方法是:

1
$ IFS=''; a=$*; echo"${#a}"

是的,没有办法避免变量($a),因为变量(参数)需要能够执行"参数扩展"(${#…})。

上面测量了$@中字符串的长度(以bash中的Unicode代码点表示)。使用lc_all=c计算字节数。

如果需要在每个字符串之间放置"空格"(假设ifs的第一个字符是空格,默认情况下为空格):

1
$ a=$*; echo"${#a}"

或者,明确地说:

1
$ IFS=' '; a=$*; echo"${#a}"

当然,这会改变$IFS的值。有两种方法可以避免这种情况:

亚壳层

1
$ ( IFS=' '; a=$*; echo"${#a}" )

延迟评估:

1
$ IFS=' ' eval 'a=$*'; echo"${#a}"

对于字节计数:

1
2
$ ( LC_ALL=C; IFS=' '; a=$*; echo"${#a}" )
$ LC_ALL=C IFS=' ' eval 'a=$*'; echo"${#a}"

是的,是的,在这种情况下,Eval是安全的。

不,算术技巧不能使答案简单:

1
2
$ set --  one two t33; a=$*; echo"$((${#a}-$#+1))"
9

空的"$@"失败:

1
2
$ set --             ; a=$*; echo"$((${#a}-$#+1))"
1


参数长度之和:

1
2
3
4
5
6
#!/bin/bash

declare -i length             # set integer attribute

for i in"${@}"; do length+=${#i}; done
echo $length