Fish Shell 精简手册

Fish Shell 精简手册

Fish —— 一个友好的交互式终端

引号

单引号 ' 中的变量不会被解析

双引号 " 中的变量会被解析

> set a 1
> echo $a
1
> echo '$a'
$a
> echo "$a"
1

输入输出重定向

和大多数的程序一样,0 代表标准输入,1 代表标准输出,2 代表标准错误

DESTINATION 可以为:

管道

标准形式:cat foo.txt | head

只捕获错误:make fish 2>| less

函数

标准形式

function ll
    ls -l $argv
end

定义别名

使用一个函数重新定义一个已经存在的命令

function ls
    command ls --color=auto $argv
end

通配符

命令替换

一个命令的输出作为另外一个命令的参数,将命令放在 ()

如果输出超过一行,每一行都将作为一个参数

IFS 设置为空可以取消行分割

echo (basename image.jpg .jpg).png
# 输出 'image.png'

begin; set -l IFS; set data (cat data.txt); end
# 将 `data` 这个变量用 `data.txt` 里面的内容赋值
# 并且不将内容分割进数组

括号拓展

将花括号 {} 中以逗号分割的字符列表进行拓展,使每个元素都成为新的参数

echo input.{c,h,txt}
# 输出 'input.c input.h input.txt'

mv *.{c,h} src/
# 将所有以 `.c` `.h` 为后缀的文件移动到 `src/` 目录中

变量

变量的声明

变量名不能为空,并且只能为字母、数字和下划线

对于变量名的开头和结尾并没有太多的要求,可以以数字和下划线开头

变量的声明是通过 set 命令来进行的

set [SCOPE_OPTIONS]
set [OPTIONS] VARIABLE_NAME VALUES...
set [OPTIONS] VARIABLE_NAME[INDICES]... VALUES...
set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...
set ( -e | --erase ) [SCOPE_OPTIONS] VARIABLE_NAME
set ( -e | --erase ) [SCOPE_OPTIONS] VARIABLE_NAME[INDICES]...
set ( -S | --show ) [SCOPE_OPTIONS] [VARIABLE_NAME]...

可选参数

-l / --local 局部变量,仅在当前作用域中有效

-g / --global (默认),全局变量,在本次运行环境中有效

-U / --universal 通用变量,当前用户下全部有效,并且具有持久性

-x / --export 该变量可以传递给子进程

-u / --unexport (默认),该变量不可以传递给子进程

-e / --erase 清除一个变量

-q / --query 测试一个变量是否已经被定义,如果是,程序返回值为 0,如果不是,程序返回值为 1

-n / --names 列出所有变量的变量名,不包含其值

-S / --show 查询某个变量的详细信息,例如是否是局部变量等

-L / --long 打印变量时不截断比较长的行

特殊变量

Variable Description
$HOME / ~ 当前用户的主目录
$PATH 当前的目录列表
$PWD 当前的工作目录
$USER 当前的用户名
$_ 当前的文件名

更多的可以参考:Special variables - Fish

位置参数

位置参数指传入到脚本或函数中的参数,在 Bash 中是$1$2

在 Fish 中可以使用 $argv 来取得传入的参数

Parameter Description
$argv 返回全部传入的参数
$argv[1] 返回第一个传入的参数
$argv[2..5] 返回第二到第五个传入的参数

变量的使用

此外 Fish 还支持变量的多重引用

> set foo bar
> set bar 1
> echo $foo
bar
> echo $$foo
1

列表索引

> echo (seq 10)[2..5]
2 3 4 5

> echo (seq 10)[2..5 1..3]
2 3 4 5 1 2 3

> echo (seq 10)[-1..1]
10 9 8 7 6 5 4 3 2 1

> echo (seq 10)[-3..-1]
8 9 10

返回值

获取程序的运行结果可以采用 $status 来获得

正常程序返回 0,异常的话返回的是一个非零的结果

注释

#

# 到本行的结尾会被当成注释忽略掉

数组

定义:set foo bar1 bar2 bar3

相当与 Python 里面的:foo = ['bar1', 'bar2', 'bar3']

可以通过 set foo[2] barbar2 修改数组中的第二个参数为 barbar2

(注意是从 1 开始算的)

命令序列

;

每个以 ; 分割开的命令都会按顺序运行,无论是否发生错误(即返回非 0 的返回值)

; and

类似与 Bash 中的 &&

每个以 ; 分割开的命令都会按顺序运行,and则限定了只有当前面最后的返回值为 0 时才运行

; or

类似与 Bash 中的 ||

每个以 ; 分割开的命令都会按顺序运行,or则限定了只有当前面最后的返回值为非 0 时才运行

条件语句

if

if grep fish /etc/shells
    echo Found fish
else if grep bash /etc/shells
    echo Found bash
else
    echo Got nothing
end

switch

switch (uname)
case Linux
    echo Hi Tux!
case Darwin
    echo Hi Hexley!
case FreeBSD NetBSD DragonFly
    echo Hi Beastie!
case '*'
    echo Hi, stranger!
end

循环

Fish 只支持 while 和 for 循环

while

> while true
    echo "Loop forever"
end
Loop forever
Loop forever
Loop forever
...

for

> for x in (seq 5)
    echo $x
end
1
2
3
4
5

循环控制

参考文章

官方文档

官方教程

内置命令/函数/功能表

bash-handbook-zh-CN