为什么乘号“*”会变成0? [重复]

问题描述 投票:0回答:1

我试图在 bash 中制作一个计算器,除了乘法之外的所有东西都可以工作。 当我尝试乘法时,我的脚本将“*”变成0。 有代码:

#!/bin/bash

calculator(){
  if [ $3 = "+" ] ; then
    echo [ $1 $3 $2 ]
  else 
    if [ $3 = "-" ] ; then
      echo [ $1 $3 $2 ]
    else 
      if [ $3 = "/" ] ; then
        echo [ $1 $3 $2 ]
      else
        if [ $3 = "*" ] ; then
          echo [ $1 $3 $2 ]
        else
          echo "$3 error"
        fi        
      fi
    fi
  fi
}

calculator 1 2 *
linux bash ubuntu
1个回答
0
投票

因为当你的 shell 看到

calculator 1 2 *
时,它会首先展开所有的 glob 模式。通配符
*
表示:0 个或多个字符、任何字符(前导
.
表示隐藏文件除外)。只有在所有扩展运行之后,您的命令才会被调用。

因此,如果您的目录中有一个名为

0
的文件,则
*
将首先替换为
0
,然后调用
calculator 1 2 0
。如果目录中有多个文件,例如
0
file.txt
image.png
,则将调用
calculator 1 2 0 file.txt image.png

类似的问题也适用于您的线路

echo [ $1 $3 $2 ]
。首先,扩展参数,然后扩展未加引号的参数的路径名。因此,即使您最初调用
calculator 1 2 '*'
,该行也会首先扩展为
echo [ 1 * 2 ]
,然后进一步扩展为
echo [ 1 0 2 ]
(或
echo [ 1 0 file.txt image.png 2 ]
,具体取决于工作目录中的文件)。

© www.soinside.com 2019 - 2024. All rights reserved.