Bash: To find length of all arguments passed
我想找出传递给脚本的所有参数的长度。如果我这样做:echo ${#1},我会看到我第一个论点的长度,如果我这样做:echo $*,我会看到我所有的论点都用空格隔开。那么,为什么不这样做呢:echo ${#*}?相反,这显示了传递的参数数量,就好像它是echo $#。
有没有一种方法可以在不将$*值写入新变量($allargs=$*的情况下对总长度进行回声,然后检查新变量(echo ${#allargs}的长度)?
- 传递给bash脚本的参数的检查数可能重复
- @Vadimlanda,我不想知道传递的参数数量。我想知道所有参数组合的总长度。对我来说,通过多少并不重要。
- 是否存在无法保存到变量的原因?
- @123,没有特别的原因。只是我在一篇文章中读到这是可能的,但我不能使它工作。
- 这篇文章是什么,肯定不可能。
- expr length"$*",但expr不是bash内置的。
- @123,它在第二页,上面写着# Centralizando a mensagem na tela Coluna=$(((Colunas - ${#*}) / 2)),对不起,它是葡萄牙语的,但代码就在那里。
- @阿德里亚诺·埃皮法斯说,虽然没有得到arg的数目,但是,正如coluna栏中所说的那样,我认为它是。
- 文章确实说:"为了避免这种麻烦,用$*替换$1,我们知道这是所有参数的列表。8号线就成了这个EDOCX1[4]
- 那是错误的。试试这个:set -- one two t33; echo"<$*> ${#*}"。扩展${#*}给出了参数的计数,而不是所有参数的长度。
- @123,它不应该是参数个数,因为作者试图获得所有字符串中的字符个数,这样他就可以得到终端上的列数,然后除以2,再减去$*的大小,这样他就可以在屏幕中央写些东西。好吧,也许他忘了,谁知道…谢谢您。
- 谢谢@sorontar,我觉得作者犯了个错误…我将把$*的内容保存到一个变量中,然后用获取它的大小。
是的,最简单的方法是:
1
| $ IFS=''; a=$*; echo"${#a}" |
是的,没有办法避免变量($a),因为变量(参数)需要能够执行"参数扩展"(${#…})。
上面测量了$@中字符串的长度(以bash中的Unicode代码点表示)。使用lc_all=c计算字节数。
如果需要在每个字符串之间放置"空格"(假设ifs的第一个字符是空格,默认情况下为空格):
或者,明确地说:
1
| $ IFS=' '; a=$*; echo"${#a}" |
当然,这会改变$IFS的值。有两种方法可以避免这种情况:
亚壳层
1
| $ ( IFS=' '; a=$*; echo"${#a}" ) |
延迟评估:
1
| $ IFS=' ' eval 'a=$*'; echo"${#a}" |
对于字节计数:
1 2
| $ ( LC_ALL=C; IFS=' '; a=$*; echo"${#a}" )
$ LC_ALL=C IFS=' ' eval 'a=$*'; echo"${#a}" |
是的,是的,在这种情况下,Eval是安全的。
不,算术技巧不能使答案简单:
1 2
| $ set -- one two t33; a=$*; echo"$((${#a}-$#+1))"
9 |
空的"$@"失败:
1 2
| $ set -- ; a=$*; echo"$((${#a}-$#+1))"
1 |
- 谢谢你的回答。我认为这是最接近我想要的,但你还是展示了很多选择,我勾选它作为正确的答案。
参数长度之和:
1 2 3 4 5 6
| #!/bin/bash
declare -i length # set integer attribute
for i in"${@}"; do length+=${#i}; done
echo $length |
- 谢谢你的回答。但我想避免太多不必要的编码。正如我提到的,我可以将$*的值保存到一个变量中并读取其长度。此外,使用for循环,我将失去每个参数之间的空间。