>

Fish shell 是我个人开发环境中最喜爱的 shell 环境,因此一些 fish 下的命令有必要掌握,方便我更高效的在 fish 下进行工作。

Fish shell 下与 bash 有很多不同,这里主要列出编写 fish shell 下脚本常用的命令

在 bash 中是通过 back-tick 符号或者 $() 来获取执行一条 shell 命令的结果的,如 dir=pwd 或者 dir=$(pwd)
在 fish 中, 则直接通过 () 来获取执行一条 shell 命令的结果, 如 dir=(pwd)

判断上条语句是否执行成功(在bash中是 $?):
echo $status

一组连续命令:
begin; ls; ls; end | wc
注意: 在 bash 中是通过 semi colon 来连接的,比如 {ls; ls;} | wc

Subshell
fish -c ‘ls; ls’ | wc
注意: 在 bash 中是 通过 圆括号() 来启动 subshell 的, 比如 (ls; ls) | wc

变量设置:
set -g var “hello”
参数:
-g global
-x export
-e erase

列出所有 export 了的变量
set -x

撤销 export
set -gu var $var

编辑某变量
vared – interactively edit the value of an environment variable

特殊变量(Special Variables):
shell 名字: (status -f)
command line arguments : $argv[1], $argv[2], … (bash 中是 $1, $2, …)
umber of command line args: (count $argv) (bash 中是 $#)
每个args依次输入: $argv (bash 中是 “$@”)
所有 args 作为整体输入: “$argv” (bash 中是 “$*”)
本进程名: %self (bash 中是 $$)
exit status of last non-asynchronous command: $status (bash 中是 $?)

List:
echo {foo,bar}

数组:
literal: set a do re mi
上述 set 语句实际上是把 一个数组(元素分别为 do, re, mi 赋值给了变量 a
可以通过 访问数组元素的方式访问每个元素,index 从 1 开始
$a[1] 是 do
负索引: $a[-1] 是数组最后一个元素
slice: $a[(seq 2 3)]
update: set a[1] do
数组大小: count $a
遍历数组index: seq (count $a)
删除数组元素: set -e a[1]
删除数组: set -e a
把数组元素依次做参数传给cmd: cmd $a (对应bash中的: cmd “${a[@]}”)
把整个数组做为一个参数传给cmd: cmd “$a” (对应bash中的: cmd “${a[*]}”)

流程控制:
not 代替 bash 中的 !

for

for var in arg …
  cmd
  …
end                    注意:  这里是 end 结尾,在 bash 中则是 done 结尾!

while

while test
  cmd
  …
end                     注意:  这里是 end 结尾,在 bash 中则是 done 结尾!

if

if test
  cmd
else if test            注意:这里 else if 没有连在一起, 在 bash 中则是 elseif
  cmd
else
  cmd
end                     注意:  这里是 end 结尾,在 bash 中则是 fi 结尾!

switch case

switch arg
  case pattern …
    cmd
  case '*'
    cmd
end 

条件测试:
[ -e /etc ]
test -e /etc

在命令行中写 条件测试语句,用 ;分割每个命令,用 and/or 来做条件逻辑

例子:

$ set testa hello
$ [ {$testa}=="hello" ] ; or echo "ok"

算数判断:
-eq -ne -lt -gt -le -ge

字符串判断:
== !=

数学运算:
math ‘1 + 1’
math ‘1.1 + 1.1’

循环语句:
while true
read cmd
eval $cmd
end

逻辑判断:
&& || !

fish prompt:
left prompt

function fish_prompt
  echo -n '$ '
end

right prompt

function fish_right_prompt
  date
end

More programming examples:
https://butterflyprogramming.neoname.eu/programming-with-fish-shell/