Fish Shell 精简手册
Fish —— 一个友好的交互式终端
引号
单引号 '
中的变量不会被解析
双引号 "
中的变量会被解析
> set a 1
> echo $a
1
> echo '$a'
$a
> echo "$a"
1
输入输出重定向
和大多数的程序一样,0
代表标准输入,1
代表标准输出,2
代表标准错误
<SOURCE_FILE
从一个文件中读取输出>DESTINATION
将输出写入到一个文件^DESTINATION
将错误写入到一个文件>>DESTINATION_FILE
将输出追加写入到一个文件^^DESTINATION_FILE
将错误追加写入到一个文件>?DESTINATION
如果文件存在则不写入输出^?DESTINATION
如果文件存在则不写入错误
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] | 返回第二到第五个传入的参数 |
变量的使用
$foo
{$foo}
此外 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
循环控制
break
跳出当前循环continue
跳过当前循环未执行的部分,直接进行下一次循环