FISH语言学习

FISH语言学习教程

什么是FISH?

FISH(Friendly Interactive SHell)是一种现代的命令行shell和命令语言,旨在为用户提供友好、强大的交互体验。它具有以下特点:

  • 智能补全:强大的自动补全功能,可以补全命令、参数、文件路径等
  • 美观界面:支持颜色、表情符号和富文本显示
  • 脚本友好:简洁的语法,适合编写自动化脚本
  • 易于使用:比传统shell更直观的设计
  • 跨平台:支持Linux、macOS和Windows(WSL)

安装FISH

Linux (Ubuntu/Debian)

1
2
sudo apt update
sudo apt install fish

macOS

1
brew install fish

Windows (WSL)

1
2
sudo apt update
sudo apt install fish

设置FISH为默认shell:

1
2
echo /usr/bin/fish | sudo tee -a /etc/shells
chsh -s /usr/bin/fish

基础语法

1. 变量赋值和引用

1
2
3
4
5
6
7
8
9
# 赋值(注意等号两边不能有空格)
set name "张三"
set age 25

# 引用变量(使用$符号)
echo "我叫 $name 今年 $age 岁"

# 临时变量(仅当前命令有效)
set -x PATH $PATH /usr/local/bin  # export效果

2. 环境变量

1
2
3
4
5
6
7
# 设置环境变量
set -x EDITOR "vim"
set -x PATH $PATH /custom/bin

# 查看环境变量
echo $PATH
env  # 显示所有环境变量

3. 命令替换

1
2
3
4
5
6
7
8
# 将命令输出赋值给变量
set current_dir (pwd)
set today (date +%Y-%m-%d)
set file_count (ls -1 | wc -l)

echo "当前目录: $current_dir"
echo "今天日期: $today"
echo "文件数量: $file_count"

4. 引号规则

1
2
3
4
5
6
7
8
9
# 双引号:允许变量扩展
set name "世界"
echo "你好, $name"  # 输出: 你好, 世界

# 单引号:禁止变量扩展
echo '你好, $name'  # 输出: 你好, $name

# 转义字符
echo "路径: /home/user/dir with space"

控制结构

1. 条件判断 (if)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 基本语法
if test $age -ge 18
    echo "成年人"
else
    echo "未成年人"
end

# 多条件判断
if test $age -ge 18; and test $age -lt 60
    echo "工作年龄"
else if test $age -ge 60
    echo "退休年龄"
else
    echo "未成年"
end

# 文件测试
if test -f "file.txt"
    echo "file.txt 是一个普通文件"
end

if test -d "directory"
    echo "directory 是一个目录"
end

# 字符串比较
if test "$name" = "admin"
    echo "欢迎管理员"
end

2. 循环 (for)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 遍历列表
for file in *.txt
    echo "处理文件: $file"
end

# 遍历数字序列
for i in (seq 1 5)
    echo "数字: $i"
end

# 遍历数组
set fruits apple banana orange
for fruit in $fruits
    echo "我喜欢 $fruit"
end

3. 循环 (while)

1
2
3
4
5
set count 1
while test $count -le 5
    echo "计数: $count"
    set count (math $count + 1)
end

4. 开关语句 (switch)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
set os "linux"
switch $os
    case "linux" "ubuntu" "centos"
        echo "Linux系统"
    case "mac" "darwin"
        echo "macOS系统"
    case "windows" "msys"
        echo "Windows系统"
    case "*"
        echo "未知系统"
end

函数

定义函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 基本函数
function greet
    echo "你好, $argv"
end

# 带参数的函数
function add
    set a $argv[1]
    set b $argv[2]
    echo (math $a + $b)
end

# 函数示例
greet "世界"  # 调用函数
add 10 20     # 输出: 30

# 复杂函数示例
function backup_file
    if test -f "$argv[1]"
        set backup (date +%Y%m%d_%H%M%S)_$argv[1]
        cp $argv[1] $backup
        echo "备份完成: $backup"
    else
        echo "文件不存在: $argv[1]"
    end
end

backup_file "important.txt"

常用内置命令

文件和目录操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 列出文件
ls -la

# 创建目录
mkdir new_directory

# 复制文件
cp source.txt destination.txt

# 移动/重命名
mv old_name.txt new_name.txt

# 删除文件
rm file.txt

# 删除目录
rmdir empty_directory
rm -rf non_empty_directory

查看命令

1
2
3
4
5
# 查看文件内容
cat file.txt
less file.txt
head -n 10 file.txt  # 前10行
tail -n 10 file.txt  # 后10行

文本处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 搜索文本
grep "pattern" file.txt

# 排序
sort file.txt

# 去重
uniq file.txt

# 统计行数
wc -l file.txt

网络命令

1
2
3
4
5
6
7
8
9
# 测试网络连接
ping google.com

# 下载文件
curl -O https://example.com/file.txt
wget https://example.com/file.txt

# 显示网络连接
netstat -tuln

实际示例

1. 系统监控脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env fish

function system_info
    echo "=== 系统信息 ==="
    echo "当前用户: $USER"
    echo "主机名: "(hostname)
    echo "操作系统: "(uname -s)
    echo "内核版本: "(uname -r)
    echo "运行时间: "(uptime)
    echo ""

    echo "=== 磁盘使用 ==="
    df -h
    echo ""

    echo "=== 内存使用 ==="
    free -h
    echo ""

    echo "=== 负载均值 ==="
    uptime
end

system_info

2. 批量文件重命名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env fish

function batch_rename
    set prefix $argv[1]
    set counter 1

    for file in *.$argv[2]
        if test -f "$file"
            set new_name (printf "%s_%02d.%s" $prefix $counter $argv[2])
            mv "$file" "$new_name"
            echo "重命名: $file -> $new_name"
            set counter (math $counter + 1)
        end
    end
end

# 使用示例:批量重命名所有txt文件
batch_rename "document" "txt"

3. 日志分析脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env fish

function analyze_log
    set log_file $argv[1]

    if not test -f "$log_file"
        echo "日志文件不存在: $log_file"
        return 1
    end

    echo "=== 日志分析: $log_file ==="
    echo "总行数: "(wc -l < $log_file)
    echo "错误行数: "(grep -i "error" $log_file | wc -l)
    echo "警告行数: "(grep -i "warning" $log_file | wc -l)
    echo ""

    echo "=== 最新10条错误 ==="
    grep -i "error" $log_file | tail -n 10
end

analyze_log "/var/log/syslog"

4. 项目自动部署脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env fish

function deploy_project
    set repo_url $argv[1]
    set deploy_dir $argv[2]

    echo "开始部署项目..."

    # 拉取最新代码
    cd $deploy_dir
    git pull origin main

    # 安装依赖
    if test -f "package.json"
        npm install
    else if test -f "requirements.txt"
        pip install -r requirements.txt
    end

    # 运行测试
    echo "运行测试..."
    make test

    # 重启服务
    echo "重启服务..."
    sudo systemctl restart myapp

    echo "部署完成!"
end

智能补全

FISH的强大功能之一是其智能补全系统:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 按Tab键自动补全:
# - 命令名称
# - 命令参数
# - 文件路径
# - 环境变量名
# - 用户名、主机名等

# 自定义补全
complete -c myapp -s h -l help -d "显示帮助信息"
complete -c myapp -s v -l version -d "显示版本信息"
complete -c myapp -f -d "输入文件"

常用技巧

1. 别名设置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 创建别名
alias ll 'ls -alh'
alias gs 'git status'
alias gp 'git push'

# 使别名永久生效(添加到配置文件)
if not functions -q fish_user_key_bindings
    function fish_user_key_bindings
    end
end

2. 配置FISH

FISH的配置文件位置:

  • 全局配置:/etc/fish/config.fish
  • 用户配置:~/.config/fish/config.fish
  • 函数目录:~/.config/fish/functions/
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# ~/.config/fish/config.fish 示例

# 设置环境变量
set -x PATH $PATH ~/bin ~/.local/bin
set -x EDITOR "vim"
set -x LANG "zh_CN.UTF-8"

# 设置提示符
function fish_prompt
    set_color purple
    echo (whoami)
    set_color normal
    echo " at "
    set_color yellow
    echo (prompt_hostname)
    set_color normal
    echo " in "
    set_color $fish_color_cwd
    echo (pwd)
    set_color normal
    echo " $ "
end

# 加载额外配置
if test -f ~/.fish_aliases
    source ~/.fish_aliases
end

3. 历史记录

1
2
3
4
5
6
7
8
# 查看历史记录
history

# 搜索历史记录
history | grep "git"

# 清理历史记录
history clear

学习资源

官方资源

在线工具

社区资源

推荐书籍

  • 《The Fish Shell》
  • 《Command Line Essentials》

练习项目

  1. 编写系统监控脚本
  2. 创建自动化备份工具
  3. 构建批量文件处理脚本
  4. 开发项目部署工具
  5. 编写日志分析脚本

总结

FISH是一种现代化、用户友好的shell和脚本语言。相比传统shell,它具有:

  • 更简洁的语法
  • 更好的用户体验
  • 强大的自动补全
  • 丰富的内置功能

更多FISH语言资源和教程,请参考官方文档和社区资源。

Licensed under CC BY-NC-SA 4.0
最后更新于 Dec 02, 2025 13:34 UTC
使用 Hugo 构建
主题 StackJimmy 设计