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
我想找出传递给脚本的所有参数的长度。
如果我这样做: 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