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

标签 bash variables arguments parameter-passing string-length

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

是否有一种方法可以回显总长度,而无需将 $* 的值写入新变量 ($allargs=$*),然后检查新变量的长度 ( echo ${#allargs})?

最佳答案

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

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

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

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

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

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

或者,明确地说:

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

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

子外壳

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

评估延迟:

$ 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

关于Bash:查找传递的所有参数的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43574421/

相关文章:

bash - CATALINA_OPTS 调试选项

python - 如何在 Python 中的函数调用之间维护列表和字典?

r - 在 R 中使用 randomforest 包的变量重要性图

c - 函数参数

c - 从C中的一行中解析可变数量的不同类型的整数

php - C++ 是否可以将带有换行符的文本传递给 C++ 程序?

linux - 在bash中递归扫描目录

linux - 将 bash 脚本中的时间与 ± x 分钟进行比较

linux - 根据文件名将平面文件系统移动、重命名到目录

variables - Neo4J 在 Cypher 中创建临时变量