Nushell
书
Cookbook
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
书
Cookbook
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
  • 入门篇

    • 介绍
    • 安装 Nu
    • 以 Nushell 的方式思考
    • 在系统中四处移动
  • Nu 基础篇

    • 数据类型
    • 加载数据
    • 处理字符串
    • 处理列表
    • 处理表格
    • 管道
    • 命令索引
  • Nushell 编程

    • 自定义命令
    • 别名
    • 运算符
    • 变量和子表达式
    • 脚本
    • 模块
    • 覆层
  • Nu 作为 Shell 使用

    • 配置
    • 环境
    • 标准输入、输出和退出码
    • 转移到系统
    • 配置第三方提示
    • Shell 中的 Shell
    • Reedline,Nu 的行编辑器
    • 外部命令
    • 自定义补全
    • Nu 的配色和主题
    • 钩子
  • 迁移到 Nu

    • 从 Bash 到 Nu
    • 从其他 Shell 或 DSL 到 Nu
    • 从命令式语言到 Nu
    • 从函数式语言到 Nu
    • Nushell 运算符
  • 高级篇

    • DataFrames
    • 元数据
    • 创建你自己的错误
    • 并行
    • 插件

数据类型

传统上,Unix Shell 命令之间使用字符串文本进行通信。一个命令通过标准输出(通常缩写为 "stdout")输出文本,另一个命令通过标准输入(或 "stdin")读入文本,以此来让两个命令进行通信。

我们可以认为这种通信是基于字符串的。

Nu 在其命令中采用了这种方法,并将其扩展到包括其他类型的数据。目前,Nu 支持两种数据类型:简单的和结构化的数据。

像许多编程语言一样,Nu 使用一组简单和结构化的数据类型对数据进行建模。简单的数据类型包括整数、浮点数、字符串、布尔、日期和路径。它还包括一个用于表示文件大小的特殊类型。

你可以通过 describe 命令获取一个值的类型:

42 | describe

整数

整数(或整形)数字:例子包括 1、5 和 100。 你可以用 into int 命令将一个字符串转换成一个整数:

"1" | into int

小数

小数是指带有一些小数成分的数字,例如,1.5,2.0,和 15.333。 你可以用 into float 命令将一个字符串转换成一个小数:

"1.2" | into float

字符串

代表文本的字符串。在 Nushell 中,我们有几种方法可以表示字符串:

双引号

"my message"

双引号是最常见的引号形式,只要是需要文字的地方,你都可能看到。

单引号

'my message'

单引号也生成一个字符串值,就像双引号一样。这里的区别是,它们允许你在文本中使用双引号,例如:'他说:"你能帮我拿下杯子吗?"'。

字符串插值

Nushell 支持字符串插值,允许你在以$为前缀的字符串中运行子表达式。比如:

echo $"6 x 7 = (6 * 7)"
# => 6 x 7 = 42
ls | each { |elt| echo $"($elt.name) is ($elt.size)" }
# => ───┬─────────────────────
# =>  0 │ genawait is 4.1 KB
# =>  1 │ learncpp is 4.1 KB
# =>  2 │ nuscripts is 4.1 KB
# => ───┴─────────────────────

裸字符串

echo hello

Nushell 的一个独特特征是,你也可以创建一个没有任何引号的单字字符串。

上面的内容和如下写法是一样的:

echo "hello"

通过 into <type> 命令将一个字符串转换为另一种类型:

"1" | into int
"1.2" | into float

另见 字符串的使用。

文本行

文本行(Lines)是具有隐含的操作系统特定行结尾的字符串。使用时需要加上操作系统特定的行尾标识。

列路径

列路径(Column Paths)是指通过表格到特定子表、列、行或单元格的路径。

例如) open data.toml | get foo.0.bar中的值foo.0.bar

Glob 模式(通配符)

在 Nushell 中,文件操作也允许你传入一个 glob 模式,有时被称为 "通配符"。这允许你给出一个可以匹配多个文件路径的模式。

最常见的模式是 *,它将匹配所有的路径。通常,你会看到这个模式被用作另一个模式的一部分,例如*.bak和temp\*。

在 Nushell 中,我们也支持通过双 * 来遍历其他目录内嵌套得更深的路径。例如,ls **/*将列出所有嵌套在当前目录下的非隐藏路径。

除了*,还有?模式,它将匹配一个单一的字符。例如,你可以通过使用模式p???来匹配 "port"。

布尔类型

布尔类型是指真或假的状态。它通常用于一个比较的结果,而非直接使用该值。

布尔类型的两个值是true和false。

日期

日期和时间被保存在日期(Date)值类型中。系统使用的日期值是有时区的,默认使用 UTC 时区。

日期有三种形式,基于 RFC 3339 标准:

  • 日期:
    • 2022-02-02
  • 日期和时间 (GMT 格式):
    • 2022-02-02T14:30:00
  • 包含时区的日期和时间:
    • 2022-02-02T14:30:00+05:00

时间间隔

时间间隔(Duration)表示时间的长短。一秒钟、五周和一年都是时间间隔。

Eg) 1wk是一个星期的时间间隔。

下表显示了目前支持的所有时间间隔:

Duration时长
1ns1 纳秒
1us1 微秒
1ms1 毫秒
1sec1 秒
1min1 分钟
1hr1 小时
1day1 天
1wk1 周
1month一个月 (30 天)
1yr一年 (365 天)
1dec十年 (10 * 365 天)

区间

区间(Ranges)是一种表达从开始到结束的数值序列的方式。它们的形式是'start' + '..' + 'end'。例如,范围 1..3表示数字 1、2、和 3。

闭区间和开区间

默认情况下,区间是包含性的,也就是说,结束值被算作区间的一部分。区间1..3包括数字3作为区间内的最后一个值。

有时,你可能想要一个达到某个数字的区间,但在输出中不包含该数字。对于这种情况,你可以使用..<代替..。例如,1..<5包含数字 1、2、3 和 4。

开放式区间

区间也可以是开放式的。你可以去掉区间的起点或终点,使其成为开放式的。

比方说,你想从 3 开始计数,但你心里没有一个具体的终点。你可以用 3.. 这个区间来表示。当你在右边使用一个无限制的区间时,请记住,这将持续计数尽可能长的时间,这可能是一个非常长的时间,你可能会在 first 这样的命令中使用开放式区间,这样你就可以从区间中取出你想要的指定数量的元素。

你也可以使区间的开始部分开放。在这种情况下,Nushell 将从0开始向上计数。区间..2包含数字 0、1 和 2。

文件大小

文件大小(File Sizes)保存在一种特殊的称为字节的整数类型中。例如包括 100b, 15kb, 和 100mb。

文件大小单位的完整列表是:

  • b: bytes
  • kb: kilobytes (aka 1000 bytes)
  • mb: megabytes
  • gb: gigabytes
  • tb: terabytes
  • pb: petabytes
  • eb: exabytes
  • kib: kibibytes (aka 1024 bytes)
  • mib: mebibytes
  • gib: gibibytes
  • tib: tebibytes
  • pib: pebibytes
  • eib: exbibyte

二进制数据

二进制数据,像图像文件的数据一样,是一组原始字节。

你可以使用 0x[...] 、 0b[...] 或 0o[...] 的形式将二进制写成一个字面值:

0x[1F FF]   # 十六进制
0b[1 1010]  # 二进制
0o[377]     # 八进制

不完整的字节将用零来填充。

结构化数据

结构化数据是在简单数据的基础上建立的。例如,结构化数据给我们提供了一种在同一数值中表示多个整数的方法,而不是一个单一的整数。目前支持的结构化数据类型有:记录、列表和表格。

记录

记录(Records)持有键值对,很像 JSON 中的对象。由于这些记录有时会有很多字段,所以记录是从上到下打印的,而不是从左到右:

echo {name: sam, rank: 10}
# => ╭──────┬─────╮
# => │ name │ sam │
# => │ rank │ 10  │
# => ╰──────┴─────╯

你可以将其转换到一个表然后遍历该记录:

echo {name: sam, rank: 10} | transpose key value
# => ╭───┬──────┬───────╮
# => │ # │ key  │ value │
# => ├───┼──────┼───────┤
# => │ 0 │ name │  sam  │
# => │ 1 │ rank │   10  │
# => ╰───┴──────┴───────╯

列表

列表(Lists)可以容纳一个以上的值。这些可以是简单的值,也可以容纳行,而一组记录的组合通常被称为 "表"。

例如,一个字符串的列表:

echo [sam fred george]
# => ───┬────────
# =>  0 │ sam
# =>  1 │ fred
# =>  2 │ george
# => ───┴────────

表

表(Table)是 Nushell 的一个核心数据结构。当你运行 Nushell 命令时,你会发现许多命令都会将表作为输出返回。表由行和列组成。

我们可以创建自己的表,就像我们创建一个列表一样。因为表也包含列,而不仅仅是值,所以我们需要传入列的名称:

echo [[column1, column2]; [Value1, Value2]]
# => ───┬─────────┬─────────
# =>  # │ column1 │ column2
# => ───┼─────────┼─────────
# =>  0 │ Value1  │ Value2
# => ───┴─────────┴─────────

我们还可以创建一个有多行数据的表格:

echo [[column1, column2]; [Value1, Value2] [Value3, Value4]]
# => ───┬─────────┬─────────
# =>  # │ column1 │ column2
# => ───┼─────────┼─────────
# =>  0 │ Value1  │ Value2
# =>  1 │ Value3  │ Value4
# => ───┴─────────┴─────────

你也可以通过一个记录列表来创建表格:

echo [{name: sam, rank: 10}, {name: bob, rank: 7}]
# => ╭───┬──────┬──────╮
# => │ # │ name │ rank │
# => ├───┼──────┼──────┤
# => │ 0 │ sam  │   10 │
# => │ 1 │ bob  │    7 │
# => ╰───┴──────┴──────╯

块

块(Blocks)表示 Nu 中的一个代码块。例如,在命令 each { |elt| echo $elt } 中,块是包含在大括号中的部分,{ |elt| echo $elt }。如果有必要,可以在一对管道符号(例如,|elt|)之间指定块参数。

块是表示可以在每行数据上执行的代码的一种有效方法。在each块中使用$elt作为参数名是惯例,但并不是必须的:each { |x| echo $x }与each { |elt| echo $elt }的结果相同。

组

以此为例:

foo {
  line1
  line2; line3 | line4
}

在该代码块内,你有两个独立的组(Groups)直到运行完毕。组是一个以分号分隔的管道集合,其中最后一个管道会输出到屏幕。

  • line1 是一个独立的组,所以该命令将运行到结束并显示在屏幕上。
  • line2 是第二组中的一个管道。它会运行,但其内容不会在屏幕上显示。
  • line3 | line4 是第二组中的第二个管道。它会运行并且它的内容会在屏幕上显示。
在GitHub上编辑此页面
Contributors: Ibraheem Ahmed, sholderbach, Justin Ma, Stefan Holderbach, Tomochika Hara, Hofer-Julian, hanjunghyuk, CAESIUS-TIM, Bruce Weirdan, 0x4D5352, Jan Klass
Next
加载数据