当前位置: 首页 > 知识库问答 >
问题:

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

萧繁
2023-03-14

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

有没有一种方法可以在不将$*的值写入新变量(allargs=$*)的情况下回显总长度,然后检查新变量的长度(echo${allargs})?

共有2个答案

屠锐
2023-03-14

求和参数的长度:

#!/bin/bash

declare -i length             # set integer attribute

for i in "${@}"; do length+=${#i}; done
echo $length
楮法
2023-03-14

是的,最简单的方法是:

$ 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脚本打印一条错误消息。 由于某种未知的原因,我出现了以下错误: 我做错了什么?

  • 如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。 func myFunc(a, b, arg ...int) {} 这个函数接受一个类似某个类型的 slice 的参数(详见第 7 章),该参数可以通过第 5.4.4 节中提到的 for 循环结构迭代。 示例函数和调用: func Greeting(prefix

  • 问题内容: 假设是一个仅打印出参数的程序; 如何正确传递变量中带引号的参数?我正在尝试这样做; 但是,当我通过一个变量时,引号似乎被忽略了,所以我得到了; bash是否有可能像对待我自己一样在第一个代码块中输入引号? 问题答案: 我不知道你从哪里来的,但看来它坏了。这是用bash编写的正确方法: 这会将每个参数打印在单独的行中,以使它们更易于区分(当然,包含换行符的参数会出现问题,但我们不会传递此

  • 文件输入。txt由两行组成:第一行是整数N空格,然后是整数K(1 ≤ N、 K级≤ 250000). Second有N个空间除数的整数,其中每个整数都小于或等于K。保证从1到K的每个整数都在数组中。任务是找到包含所有整数的最小长度的子数组。并打印其开始和结束。请注意,索引从1开始。 示例: 我在最近的一次编程比赛中完成了这个任务。一切都结束了,我没有作弊。我已经使用python 3实现了它: 这个

  • 本文向大家介绍Python中函数的参数传递与可变长参数介绍,包括了Python中函数的参数传递与可变长参数介绍的使用技巧和注意事项,需要的朋友参考一下 1.Python中也有像C++一样的默认缺省函数 定义有默认参数的函数时,这些默认值参数 位置必须都在非默认值参数后面。 调用时提供默认值参数值时,使用提供的值,否则使用默认值。 2.Python可以根据参数名传参数 第4行,没有指定参数名,按照顺

  • 问题内容: 我正在上unix / linux类,我们还没有学习变量或函数。我们刚刚学习了一些基本实用程序,例如标志和管道,输出和追加到文件。在实验室任务中,他希望我们找到最大的文件并将其复制到目录中。 我可以获得5个最大的文件,但我不知道如何在一个命令中将它们传递给cp 问题答案: 这将是: 假设管道是正确的。反引号替换该行中命令的输出。 您还可以进行测试: 将全部复制,和成。