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

Posted

技术标签:

【中文标题】Bash:查找传递的所有参数的长度【英文标题】:Bash: To find length of all arguments passed 【发布时间】:2017-09-20 07:52:35 【问题描述】:

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

有没有办法回显总长度,而无需将 $* 的值写入新变量 ($allargs=$*),然后检查新变量 (echo $#allargs) 的长度?

【问题讨论】:

Check number of arguments passed to a Bash script的可能重复 @VadimLanda,我不想知道传递的参数数量。我想知道所有参数组合的总长度。对我来说,通过多少并不重要。 是否有无法保存到变量的原因? @123,没有特别的原因。只是我在一篇文章中读到有可能,但我无法让它发挥作用。 expr length "$*",但 expr 没有内置 bash。 【参考方案1】:

对参数的长度求和:

#!/bin/bash

declare -i length             # set integer attribute

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

【讨论】:

感谢您的回答。但我想避免过多不必要的编码。正如我所提到的,我可以将 $* 的值保存到一个变量中并读取它的长度。此外,使用你的 for 循环我会丢失每个参数之间的空格。【参考方案2】:

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

$ 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

【讨论】:

感谢您的回答。我认为这是最接近我想要的答案,但您仍然提供了很多选择,我将其标记为正确答案。

以上是关于Bash:查找传递的所有参数的长度的主要内容,如果未能解决你的问题,请参考以下文章

Shell数组以脚本传递参数

Shell数组以脚本传递参数

从 rexx 代码向 ispf 宏传递参数时出现无效长度错误

查找长度小于或等于 L 的 n 的所有分区

sh 查找传递给它的最后一个bash脚本参数

post的参数传递长度有限制吗