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
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》
练习项目
- 编写系统监控脚本
- 创建自动化备份工具
- 构建批量文件处理脚本
- 开发项目部署工具
- 编写日志分析脚本
总结
FISH是一种现代化、用户友好的shell和脚本语言。相比传统shell,它具有:
- 更简洁的语法
- 更好的用户体验
- 强大的自动补全
- 丰富的内置功能
更多FISH语言资源和教程,请参考官方文档和社区资源。