命令行中以不同方式赋值会导致不同的结果,其区别是什么?

命令行中以不同方式赋值会导致不同的结果,其区别是什么?

什么差异导致了这些命令的不同结果?

  1. a=2 echo $a
  2. set a=2 echo $a
  3. a=2; echo $a
  4. set a=2; echo $a

答案1

  1. a=2 echo $a

    结果: 输出一个空行

    原因:Bash 提供了其变量的一个子集(环境)到你用它调用的每个程序(你可以用export内置)。在命令前加上前缀 ega=2会告诉 bash 将$a(带有值2) 添加到环境中,但是

    • 仅适用于该特定程序,并且
    • 而不是其自身使用的变量集bash

    所以,如果echo有一个程序(它是实际上是一个内置$a),它将与其他环境变量一起接收……但是echo 不在乎关于环境变量 - 它只会返回您提供的参数。由于$a本身并未定义为变量bash,因此您的命令相当于一个裸echo命令,它会发出换行符,从而为您提供一个空白行。

  1. set a=2 echo $a

    结果: 没有输出

    原因:这并不是你所想的那样——事实上,命令echo根本没有被调用。当set不带选项调用,它设置位置参数按顺序执行您提供的参数。您可以使用几个额外的命令来查看此信息:

    $ set a=2 echo $a
    $ echo $1
    a=2
    $ echo $2
    echo
    

    ...并echo $3给出一个空白行,因为您试图设置$3$a,但它不存在。

  1. a=2; echo $a

    结果: 输出2(最后!)

    原因:这是获取所需内容的正确方法:将变量设置$a2,然后将其echo作为$a参数进行调用。

  1. set a=2; echo $a

    结果:

    • 如果$a已经设置为2输出2
    • 如果$a未设置:输出一个空行

    原因:希望您能根据上述解释自己解决这个问题。

相关内容