Shell学习(一)

前言

不容易有点学习时间,得抓紧补齐技术空缺了。打算快速肝完 shell 这块基础的。

Shell 基础

history

history 调用历史文件。bash一般在 ~/.bash_history 文件中。zsh一般在 ~/.zsh_history 文件中。以此类推。

1
2
history -c        # 清空历史(不会删除文件)
history -r # 恢复历史

进程,环境变量、参数相关

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
!!                # 执行上次命令
pstree # 查看进程树
ps -ef --forest # 查看进程(树形)

bash # 开启子shell
source xxx.sh # 在当前shell执行命令

set # 输出所有变量
env # 全局变量
declare # 所有变量
export # 设置和显示值
unset # 取消环境变量

$0 # 第0个参数,执行的脚本路径
$1 # 第1个参数,以此类推
$# # 获取参数总数
$*/$@ # 所有参数

$? # 上一次执行状态变量,0代表成功
$$ # 当前shell进程号
$! # 上一次后台进程PID
$_ # 返回上个命令最后一个参数

# 同时执行多个命令,可能只有一个进程号
eval mkdir a;cd a;mkdir b;cd b;mkdir c;cd c
# 执行完退出当前bash
exec echo "exit"

ps

输出相关

1
2
3
4
5
# 双引号解析字符串,单引号不解析直接输出
echo -e "123\n" # 解析字符串的特殊符号
echo -n "123" # 不换行输出

printf "123\n" # 解析字符串的特殊符号

常见解析符号:

  • \n 换行
  • \r 回车
  • \t 制表符
  • \b 退格

字符串操作

1
2
3
4
5
6
7
8
9
10
11
12
name=bashbash123
echo ${name} # 不处理直接输出
echo ${#name} # 输出值长度
echo ${name:start:length} # substring

echo ${name#str} # 删除name中str第一次出现(最短匹配正则)
echo ${name##str} # 删除name(最长匹配正则)
echo ${name%str} # 删除name中str最后出现(最短匹配正则)
echo ${name%%str} # 删除name(最长匹配正则)

echo ${name/a/b} # 当个替换
echo ${name//a/b} # 全部替换

字符串

1
2
3
4
5
# 判断赋值
echo ${name:-word} # 如果为空,输出word
echo ${name:=word} # 如果为空,输出word,且赋值给name
echo ${name:?word} # 如果为空,输出到stderr
echo ${name:+word} # 如果为空,什么都不做,否则返回word

字符串

1
2
3
4
5
6
7
8
9
10
# 统计变量长度方法
echo ${#name}
echo $name | wc -L
expr length "${name}"
echo $name | awk '{print length($0)}'

# 借助变量替换,实现批量文件重命名
touch a_{1..5}_finished.jpg
touch a_{1..5}_finished.png
for i in `ls`;do mv $i ${i//_finished/};done

字符串

序列

1
2
3
4
seq 5               # 1开始5结束
seq 2 6 # 2开始6结束
seq 2 2 7 # 2开始,步长2,小于等于7结束
seq -s ":" 2 2 7 # 2开始,步长2,小于等于7结束,分隔符为:

序列

进程和线程

shellbash 都是独立的进程或者说是子进程。除此之外,bash 还有多线程。
以下自己体会~~
subshell

内置命令和外置命令

内置命令:bash 在编译的时候,预设的命令。在启动 bash 后就已经加载在内存中。
外置命令:存储在磁盘中的(脚本文件,二进制文件等)通过环境变量执行的命令

1
2
3
4
5
6
7
# 查看所有内置命令
compgen -b

# 查看该命令是不是内建的
type time
type ps
type exit

内建命令

特殊符号总结

1
2
3
4
${name}         # 取出变量
$(cmd) # 在括号中执行命令且拿到命令的结果
`cmd` # 同上
(cmd) # 子shell多线程 $BASH_SUBSHELL
文章作者: Shengyaqingfeng
文章链接: https://creazyboyone.github.io/shell1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Shengyaqingfeng's Blog