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

为什么 ${*// /*} 不能在命令行参数中用 * 替换空白?

孔欣荣
2023-03-14

我希望我的脚本执行其所有整数参数的乘积。我试图用*替换空白,然后计算操作,而不是执行循环。但是我得到了以下我不明白的结果:

#!/bin/bash
# product.sh

echo $(( ${*// /*} ))  # syntax error with ./product.sh 2 3 4
args=$*
echo $(( ${args// /*} ))  # ./product.sh 2 3 4 => outputs 24

为什么第一个在使用中间变量工作正常时产生错误?

共有3个答案

夏景同
2023-03-14

或者使用printf,如下所示:

echo $(( $(printf '%s*' $*)1 ))
施海
2023-03-14

在您的示例中,值<code>$*</code>实际上不包含任何文字空间,因此<code>${*//*}</code>不执行任何操作。

如果是这样,这些星号将受通配符扩展的影响,因此执行替换的想法似乎相当脆弱,即使它有效。

我将简单地创建一个函数来处理参数,而不是依赖替换的技巧——当参数之一是变量等时,这往往会出现令人讨厌的情况。

mul () {
    case $# in
      [01]) echo "$@";;
      *) local n=$1; shift; echo $((n * $(mul "$@")));;
    esac
}
闻人修平
2023-03-14

第一个是如何产生错误的:来自Bash参考手册:

如果参数是'@'或'*',则依次对每个位置参数应用替换操作

(强调我的)
也就是说,表达式${*// /*}替换了位置参数中的空格,而不是分隔位置参数的空格。该表达式扩展为2 3 4(在算术上下文中使用时会出现语法错误),因为参数本身不包含空格。试试

./product '2 ' '3 ' 4

你会看到不同之处。

 类似资料:
  • 如何将命令行参数转换为bash脚本数组? 我想拿这个: 并将其转换为 这样我就可以在脚本中进一步使用myArray。 这篇之前的SO帖子很接近,但没有深入到如何创建数组:如何在Bash中解析命令行参数? 我需要将参数转换为常规bash脚本数组;我意识到我可以使用其他语言(例如Python),但需要在bash中执行此操作。我想我在寻找一个“追加”函数或类似的东西? 更新:我还想问一下如何检查零参数并

  • 问题内容: 我正在尝试使用命令行perl替换多行文件中的文本。我正在使用Ubuntu Natty。 以下是我的文本文件(称为test.txt)的内容: 以下是我的perl命令: 但是,下面是我最终得到的结果,而不是替换文件中的所有文本: 我在RegexBuddy中为Perl尝试了Regex,它与文本文件中的所有内容都匹配,但是由于某些原因,在命令行上使用perl不能正常工作。 我将不胜感激。 提前

  • 行动时刻 - 使用命令替换 到目前为止,我们使用双引号来包含将被引用的变量。 Unlang还具有反引号字符串,允许命令替换。这些反引号内的字符串的计算方式类似于可以进行字符串扩展的双引号字符串。 让我们修改上一个练习,以显示操作中的命令替换: 1.编辑FreeRADIUS配置目录下的sites-available / default虚拟服务器,并在该部分顶部的post-auth部分中添加以下内容:

  • 这个程序要求我写一个程序,要求用户键入两个数字x,y,和一个算术符号s。根据输入的符号,程序将两个数字相加或相减,并使用带有三个参数的返回类型方法返回结果。 示例:如果输入是2、3和'+'。然后,程序将打印:5 这就是我所做的; 但我无法在不知道为什么的if命令中获取(char1)

  • 我这里有个问题。当我使用ajax传递一个包含"的参数给我的控制器时,它被一个空格所取代。 例如,我将使用ajax传递value=。当我在控制器中使用System.out.println()时,它会显示。我试过使用其他特殊字符,但似乎没有问题。 请帮忙。提前谢谢。

  • 为了方便起见,我们支持在运行 Blade 应用的时候修改一些配置,比如我在运行时指定端口: java -jar blade-app.jar --server.port=9088 当然还支持一些其他的命令行参数,看看下面的表格: 命令行参数 描述 示例 server.address 服务地址,默认是本机 0.0.0.0 回环地址 --server.address=192.168.1.100 serv