Bash:查找传递的所有参数的长度

Bash: To find length of all arguments passed

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

有没有办法在不将 $* 的值写入新变量 ($allargs=$*) 然后检查新变量 (echo ${#allargs}) 的长度的情况下回显总长度?

求和参数的长度:

#!/bin/bash

declare -i length             # set integer attribute

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

嗯,是的,最简单的方法是:

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

是的,无法避免变量 ($a),因为需要变量(参数)才能执行 "parameter expansion"(${#…})。

上面,测量 $@.
中字符串的长度(bash 中的 UNICODE 代码点) 使用 LC_ALL=C 来计算字节数。

如果您需要在每个字符串之间放置 "an space"(假设 IFS 的第一个字符是 space,默认情况下):

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

或者,明确地说:

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

那当然要改$IFS的值了。有两种方法可以避免这种情况:

一个子外壳

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

eval 延迟:

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

对于字节计数:

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

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

不,算术技巧不会使答案变得简单:

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

失败,空 "$@":

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