数据类型
传统的 Unix shell 命令通过文本字符串进行通信 - 一个命令将文本写入标准输出(stdout),另一个命令从标准输入(stdin)读取文本。这种机制允许多个命令通过"管道"组合在一起。
Nushell 继承了这种方法,并扩展支持除字符串外的其他数据类型。
像许多编程语言一样,Nu 使用一组简单和结构化的数据类型对数据进行建模。简单数据类型包括整数、浮点数、字符串和布尔值。还有日期、文件大小和时间间隔等特殊类型。
describe
命令可以返回数据的类型:
42 | describe
# => int
数据类型概览
类型 | 示例 |
---|---|
整数 | -65535 |
浮点数 | 9.9999 , Infinity |
字符串 | "第18洞" , '第18洞' , `第18洞`, 第18洞, r#'第18洞'# |
布尔值 | true |
日期 | 2000-01-01 |
时间间隔 | 2min + 12sec |
文件大小 | 64mb |
区间 | 0..4 , 0..<5 , 0.. , ..4 |
二进制数据 | 0x[FE FF] |
列表 | [0 1 '二' 3] |
记录 | {name:"Nushell", lang: "Rust"} |
表格 | [{x:12, y:15}, {x:8, y:9}] , [[x, y]; [12, 15], [8, 9]] |
闭包 | {|e| $e + 1 | into string } , { $in.name.0 | path exists } |
单元格路径 | $.name.0 |
代码块 | if true { print "你好!" } , loop { print "按ctrl-c退出" } |
空值 | null |
任意类型 | let p: any = 5 |
基础数据类型
整数
描述: | 没有小数部分的数字(正数、负数和0) |
类型标注: | int |
字面量语法: | 十进制、十六进制、八进制或二进制数值,不带小数点。如-100 , 0 , 50 , +50 , 0xff (十六进制), 0o234 (八进制), 0b10101 (二进制) |
参见: | 语言参考 - 整数 |
简单示例:
10 / 2
# => 5
5 | describe
# => int
浮点数
描述: | 带有小数部分的数字 |
类型标注: | float |
字面量语法: | 包含小数点的十进制数值。如1.5 , 2.0 , -15.333 |
参见: | 语言参考 - 浮点数 |
简单示例:
2.5 / 5.0
# => 0.5
提示
与大多数编程语言一样,Nushell中的浮点数是近似值。
10.2 * 5.1
# => 52.01999999999999
字符串
描述: | 表示文本的字符序列 |
类型标注: | string |
字面量语法: | 参见字符串处理 |
参见: | 处理字符串 |
语言参考 - 字符串 |
Nushell提供了多种表示字符串的方式和许多处理字符串的命令。
简单示例:
let audience: string = "World"
$"Hello, ($audience)"
# => Hello, World
布尔值
描述: | 真或假值 |
类型标注: | bool |
字面量语法: | 字面量true 或false |
参见: | 语言参考 - 布尔值 |
布尔值通常是比较的结果。例如:
let mybool: bool = (2 > 1)
$mybool
# => true
let mybool: bool = ($env.HOME | path exists)
$mybool
# => true
布尔结果常用于控制执行流程:
let num = -2
if $num < 0 { print "It's negative" }
# => It's negative
日期
描述: | 使用国际标准日期时间描述符表示特定时间点 |
类型标注: | datetime |
字面量语法: | 参见语言指南 - 日期 |
简单示例:
date now
# => Mon, 12 Aug 2024 13:59:22 -0400 (now)
# 格式化为Unix时间戳
date now | format date '%s'
# => 1723485562
时间间隔
描述: | 表示时间段的单位 |
类型标注: | duration |
字面量语法: | 参见语言参考 - 时间间隔 |
时间间隔支持分数值和计算。
简单示例:
3.14day
# => 3day 3hr 21min
30day / 1sec # How many seconds in 30 days?
# => 2592000
文件大小
描述: | 表示文件大小或字节数的特殊数值类型 |
类型标注: | filesize |
字面量语法: | 参见语言参考 - 文件大小 |
Nushell支持分数文件大小和计算:
0.5kB
# => 500 B
1GiB / 1B
# => 1073741824
(1GiB / 1B) == 2 ** 30
# => true
区间
描述: | 描述从起始值到结束值的数值范围,可选步长 |
类型标注: | range |
字面量语法: | <起始值>..<结束值> 。例如1..10 |
<起始值>..<第二个值>..<结束值> 。例如2..4..20 | |
参见: | 语言指南 - 区间 |
简单示例:
1..5
# => ╭───┬───╮
# => │ 0 │ 1 │
# => │ 1 │ 2 │
# => │ 2 │ 3 │
# => │ 3 │ 4 │
# => │ 4 │ 5 │
# => ╰───┴───╯
单元格路径
描述: | 用于导航到结构化值内部值的表达式 |
类型标注: | cell-path |
字面语法: | 行号(整数)和列名(字符串)的点分隔列表。例如name.4.5 |
需要时可以使用前导$. 消除歧义,例如将单元格路径赋值给变量时 | |
参见: | 语言参考 - 单元格路径 |
导航和访问结构化数据章节 |
简单示例:
let cp = $.2
# 返回索引2处的列表项
[ foo bar goo glue ] | get $cp
# => goo
闭包
描述: | 匿名函数,通常称为lambda函数,它接受参数并"闭合"(即使用)其作用域外的变量 |
类型标注: | closure |
字面量语法: | {|参数| 表达式 } |
参见: | 语言参考 - 闭包 |
简单示例:
此闭包返回比较的布尔结果,然后在where
命令中使用它返回所有大于5的值。
let compare_closure = {|a| $a > 5 }
let original_list = [ 40 -4 0 8 12 16 -16 ]
$original_list | where $compare_closure
# => ╭───┬────╮
# => │ 0 │ 40 │
# => │ 1 │ 8 │
# => │ 2 │ 12 │
# => │ 3 │ 16 │
# => ╰───┴────╯
二进制数据
描述: | 表示二进制数据 |
类型标注: | binary |
字面量语法: | 0x[ffffffff] - 基于十六进制的二进制表示 |
0o[1234567] - 基于八进制的二进制表示 | |
0b[10101010101] - 基于二进制的二进制表示 | |
参见: | 语言指南 - 二进制 |
二进制数据,如图像文件的数据,是一组原始字节。
简单示例 - 确认JPEG文件以正确的标识符开头:
open nushell_logo.jpg
| into binary
| first 2
| $in == 0x[ff d8]
# => true
结构化数据类型
Nushell包含一组可以包含上述基本类型的结构化数据类型。例如,结构化数据为我们提供了一种在同一值中表示多个浮点值的方法,比如温度读数列表。Nushell支持以下结构化数据类型:
列表
描述: | 零个或多个任意类型值的有序序列 |
类型标注: | list |
字面量语法: | 参见语言指南 - 列表 |
参见: | 使用列表 |
导航和访问结构化数据 |
简单示例:
[张三 李四 王五]
# => ╭───┬──────╮
# => │ 0 │ 张三 │
# => │ 1 │ 李四 │
# => │ 2 │ 王五 │
# => ╰───┴──────╯
记录
描述: | 保存键值对,将字符串键与各种数据值关联 |
类型标注: | record |
字面量语法: | 参见语言指南 - 记录 |
参见: | 使用记录 |
导航和访问结构化数据 |
简单示例:
let my_record = {
name: "张三"
rank: 99
}
$my_record
# => ╭───────┬────────────╮
# => │ name │ 张三 │
# => │ rank │ 99 │
# => ╰───────┴────────────╯
$my_record | get name
# => 张三
表格
描述: | 具有行和列的二维容器,每个单元格可以保存任何基本或结构化数据类型 |
类型标注: | table |
参见: | 使用表格 |
导航和访问结构化数据 | |
语言指南 - 表格 |
表格是Nushell中的核心数据结构。运行命令时,你会发现许多命令返回表格作为输出。表格有行和列。
提示
内部表格只是记录列表。这意味着任何提取或隔离表格特定行的命令都会产生记录。例如,get 0
在列表上使用时提取第一个值。但在表格(记录列表)上使用时,它提取一条记录:
[{x:12, y:5}, {x:3, y:6}] | get 0
# => ╭───┬────╮
# => │ x │ 12 │
# => │ y │ 5 │
# => ╰───┴────╯
其他数据类型
任意类型
描述: | 用于类型标注或签名时,匹配任何类型。换句话说,是其他类型的"超集" |
类型标注: | any |
字面语法: | N/A - 任何字面值都可以赋值给any 类型 |
参见: | 语言参考 - 任意类型 |
代码块
描述: | 一些Nushell关键字(如if 和for )使用的语法形式 |
类型标注: | N/A |
字面量语法: | N/A |
参见: | 语言参考 - 代码块 |
简单示例:
if true { print "It's true" }
上面的{ print "It's true" }
部分就是一个代码块。
空值
描述: | nothing 类型用于表示另一个值的缺失 |
类型标注: | nothing |
字面量语法: | null |
参见: | 语言参考 - 空值 |
简单示例
使用可选操作符?
会在请求的单元格路径不存在时返回null
:
let simple_record = { a: 5, b: 10 }
$simple_record.a?
# => 5
$simple_record.c?
# => Nothing is output
$simple_record.c? | describe
# => nothing
$simple_record.c? == null
# => true