为什么bash变量“不同”?

时间:2013-01-29 05:34:29

标签: bash shell variables

为什么bash'变量'与其他'普通'编程语言中的变量不同有什么原因?

是因为它们是由以前程序的输出设置的,还是必须由某种文字文本设置,即它们必须由某些程序的输出设置或通过标准输入输出文本的东西/输出或控制台等?

我无法使用正确的词汇,但是任何能够理解我想说的内容并且可能使用正确的词汇或者指出一些我可以更好地理解变量概念的文档的人。

2 个答案:

答案 0 :(得分:3)

在大多数语言中,变量可以包含不同类型的值。例如,在Python中,变量可以是可以在(a-1)上进行算术运算的数字,可以拆分的数组或字符串(a[3:]),或者是自定义的嵌套对象({{1 }})。

在bash中,您无法直接执行此操作。如果我理解你的话,你会问为什么会这样。

有两个原因导致你无法在bash中真正做同样的事情。

一:环境变量(通常)是简单的key =值字符串,而原始sh是Unix进程模型之上的一个非常薄的包装器。出于技术和兼容性原因,Bash的工作原理相同。由于所有变量都是(基于)字符串,因此您无法真正拥有丰富的嵌套类型。

这也意味着您无法在调用的子shell /下标中设置变量。该变量不会在父脚本中设置,因为这不是环境变量的工作方式。

二:原始sh没有分离代码和数据,因为这样可以更容易地以交互方式工作。 Sh将所有非特殊字符视为字面值。即person.name.first_name被认为是四个文字字符串:一个命令和三个参数。

Bash不能只决定find / -name foo现在意味着“变量find的值除以变量名的否定值”,因为这意味着每个人的find命令都会开始破坏。这就是为什么你不能使用其他语言的简单解引用语法。

即使find / -name也不能用于减法,因为它可以很容易地作为$name-1的一部分,一个带时间戳的文件名。

答案 1 :(得分:1)

我想说它与Bash功能有关。 Bash函数不能返回值,只能返回状态代码。

所以使用Bash你可以有一个功能

foo ()
{
  grep bar baz
}

但是如果你试图“保存”函数的返回值

quux=$?

它只是保存退出状态,而不是任何值。将此与Javascript等语言进行对比,函数实际上可以返回值。

foo ()
{
  return document.getElementById("dog").getAttribute("cat");
}

并像这样保存

quux = foo();