方法一:${var:0:1}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fang@varch ~ $ var="012345678"

# 下标从 0 开始
fang@varch ~ $ echo ${var:0:1}
0

# 下标不可缺省
fang@varch ~ $ echo ${var::1}
zsh: closing brace expected

# 下标负数返全部
fang@varch ~ $ echo ${var:-1:1}
012345678
fang@varch ~ $ echo ${var:-1:2}
012345678

# 个数缺省返全部
fang@varch ~ $ echo ${var:0}
012345678

# 个数超出返全部
fang@varch ~ $ echo ${var:0:100}
012345678

方法二:${str%${str#?}}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# POSIX 切分写法
# # 表示删除指定模式的第一处匹配
# % 从右开始,返回删除指定字串后余下全部
# ? 是正则表达式,只匹配单个字符

fang@varch ~ $ str="0123456789"

# 提取第一个字符外其余所有内容
fang@varch ~ $ echo ${str#?}
123456789

# 从右开始,返回删除指定字符串余下全部
fang@varch ~ $ echo ${str%"89"}
01234567

# 精准严格匹配,从右开始第一个字符不符合则不操作
fang@varch ~ $ echo ${str%"8"}
0123456789

# 返回字符串第一个字符
fang@varch ~ $ echo ${str%${str#?}}
0

方法三:$(echo $str | cut -c1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fang@varch ~ $ str="0123456789"

# cut -c1 1 指的是位置不是个数
fang@varch ~ $ echo $str | cut -c1
0
fang@varch ~ $ echo $str | cut -c2
粗体1
fang@varch ~ $ echo $str | cut -c3
2

# !注意给赋值要加上 $
fang@varch ~ $ var=(echo $str | cut -c3)
zsh: parse error near `|'
fang@varch ~ $ var=(echo $str | cut -c1)
zsh: parse error near `|'
fang@varch ~ $ var=$(echo $str | cut -c1)
fang@varch ~ $ echo $var
0

参考拓展

1 《shell脚本实战(第2版》