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

时间:2017-04-23 17:39:45

标签: bash variables arguments parameter-passing string-length

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

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

2 个答案:

答案 0 :(得分:1)

总结参数的长度:

#!/bin/bash

declare -i length             # set integer attribute

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

答案 1 :(得分:1)

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

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

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

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

如果你需要在每个字符串之间放置一个“空格”(假设IFS的第一个字符是一个空格,默认情况下是这样):

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

或者,要明确:

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

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

子shell

$ ( 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
相关问题