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:查找传递的所有参数的长度的主要内容,如果未能解决你的问题,请参考以下文章