特殊变量

  • $0

Shell 解释器的路径(终端中),或 Shell 脚本的路径(执行脚本时),可以理解为当前进程的 argv[0]

> echo $0
/usr/bin/zsh
  • $1, $2, $3, ...

同上,进程的 argv[1]argv[2]argv[3] ……

> sh <(echo 'echo args: $1 $3') arg1 arg2 arg3 arg4
args: arg1 arg3
  • $#

参数的个数,不包括 $0

> sh <(echo 'echo count: $#') arg1 arg2 arg3 arg4
count: 4
  • $?

上一次命令的的退出代码:

> sh -c 'exit 233'
> echo $?
233
  • $-

显示 Shell 当前使用的选项,用得非常少:

> echo $-
0569BJPXZgims
  • $$

当前进程的 PID:

> cat /proc/$$/status | grep -E '^Pid:'
Pid:    1987

> cat /proc/$$/cmdline
/usr/bin/zsh
  • $!

上一条后台命令的 PID:

> cat /proc/self/status | grep -E '^Pid' &
[1] 36902 36903  # 36903 是 grep 的 PID
Pid:    36902
[1]  + done       cat /proc/self/status | grep -i --color -E '^Pid'
  • $_

上一条命令的最后一个参数:

> echo arg1 arg2 arg3 arg4
arg1 arg2 arg3 arg4

> echo $_
arg4

字符串截取

> VAR="123456"
  • ${VAR:<BEGIN>}

截取从下标 BEGIN 开始,直到结尾的子串:

> echo ${VAR:2}  
3456
  • ${VAR:<BEGIN>:<LEN>}

截取从下标 BEGIN 开始,长为 LEN 的子串:

> echo ${VAR:1:3}  
234
  • ${VAR:0-<BEGIN>}

截取从右边第 BEGIN 个字符开始,直到结尾的子串:

> echo ${VAR:0-2}
56
  • ${VAR:0-<BEGIN>:<LEN>}

截取从右边第 BEGIN 个字符开始,长度为 LEN 的子串:

> echo ${VAR:0-4:2}
34

查找替换

> VAR="114514"
  • ${VAR#<STR>}

从前往后,将匹配到的最短子串删除(* 表示通配符):

> # 114514 
> # ^^
> echo ${VAR#1*1}
4514
  • ${VAR##<STR>}

从前往后,将匹配到的最长子串删除:

> # 114514
> # ^^^^^
> echo ${VAR##1*1}
4
  • ${VAR%<STR>}

从后往前,将匹配到的最短子串删除:

> # 114514
> #     ^^
> echo ${VAR%1*4}
1145
  • ${VAR%%<STR>}

从后往前,将匹配到的最长子串删除:

> # 114514
> # ^^^^^^
> echo ${VAR%%1*4}
(empty)
  • ${VAR/<OLD>/<NEW>}

将第一个匹配的 OLD 替换为 NEW:

> echo ${VAR/1/0}
014514
  • ${VAR//<NEW>/<NEW>}

将所有 OLD 替换为 NEW:

> echo ${VAR//1/0}
004504