# 变量和子表达式

在 Nushell 中有两种类型的求值表达式:变量和子表达式。如果你看到一个以美元符号($)开头的字符串的话,你就应该知道你看到的是一个求值表达式。这表明当 Nushell 运行到此处时需要执行一个求值操作来处理这个表达式并使用此结果值。这两种求值表达式都支持一个简单形式和一个"路径"形式,用于处理更复杂的数据。

# 变量

在两种求值表达式中比较简单的是变量。在求值过程中,变量被其值所取代。

如果我们创建了一个变量,我们可以通过使用$来引用它并打印其内容:

> let my-value = 4
> echo $my-value
4

Nushell 中的变量是不可变的,这意味着你不能在声明后修改它的值。 不过它们可以在嵌套块中被隐藏,这导致:

> let my-value = 4
> do { let my-value = 5; echo $my-value }
5
> echo $my-value
4

# 变量路径

变量路径通过深入变量的内容,找到其中的列,并最终获得一个值。比如,对于前面的例子如果我们不是赋值4,而是赋值了一个表的值:

> let my-value = [[name]; [testuser]]

我们可以使用一个变量路径来访问变量$my-value并只用一步从name列获得数值:

> echo $my-value.name
testuser

# 子表达式

你总是可以通过用圆括号()来执行一个子表达式并使用其结果。请注意,Nushell 以前的版本(0.32 以前)使用$()

括号中包含了一个流水线,该流水线将被执行完毕然后使用结果值。例如,(ls)将运行ls命令并返回结果表格,(git branch --show-current)运行外部git命令并返回一个包含当前分支名称的字符串。你也可以使用括号来运行数学表达式,如(2 + 3)

子表达式也可以是管道,而不仅仅是单个命令。如果我们想得到一个大于 10KB 的文件名列表,我们可以使用子表达式来运行一个管道,并将其赋值给一个变量:

> let names-of-big-files = (ls | where size > 10kb)
> echo $names-of-big-files
───┬────────────┬──────┬──────────┬──────────────
 # │    name    │ type │   size   │   modified
───┼────────────┼──────┼──────────┼──────────────
 0 │ Cargo.lock │ File │ 155.3 KB │ 17 hours ago
 1 │ README.md  │ File │  15.9 KB │ 17 hours ago
───┴────────────┴──────┴──────────┴──────────────

# 子表达式和路径

子表达式也支持路径,例如,假设我们想获得当前目录下的文件名列表,其中一个办法是使用管道:

> ls | get name

我们也可以使用子表达式路径只需一步即可:

> echo (ls).name

这取决于代码的需要和你个人喜欢的编码风格。

# 简化子表达式 (行条件)

Nushell 支持使用一种简化的方式访问子表达式中的列,你可能已经使用过这个功能了。例如,如果我们想只看到ls中大小至少为 10KB 的行,我们可以通过:

> ls | where size > 10kb

where size > 10kb是一个由两部分组成的命令:命令名where和简化的表达式size > 10kb。我们说简化是因为这里的size$it.size的简洁版。也可以用以下任何一种方式来写:

> ls | where $it.size > 10kb
> ls | where ($it.size > 10kb)
> ls | where {|$it| $it.size > 10kb }

为了使简化语法正常工作,列名必须出现在操作的左侧(如size > 10kb中的size)。