Linux Shell速查记录

1. Shell的36个常用命令

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# 1.更改账号密码
passwd

# 2.联机帮助
man

# 3.远程登陆
rlogin aa 远程登陆到工作站aa
rlogin aa -l user 使用user账号
telnet aa
telnet 192.168.1.1

# 4.文件或目录处理
ls [-atFlgR] [name]
-a 包括隐藏文件
-t 最后修改时间
-F 当前目录文件名和类型
-l 所有文件信息
-lg 同上,并显示工作组名
-R 显示目录下及其子目录

# 5.改变工作目录
cd 改变目录位置至用户登录时的工作目录

# 6.复制文件
cp [-r] 源地址 目的地址
-r 复制整个目录

# 7.移动或更改文件、目录名称
mv 源地址 目的地址

# 8.建立新目录
mkdir 目录名

# 9.删除目录
rm -r dir 删除目录dir及其子目录下所有文件

# 10.删除文件
rm 文件名

# 11.列出当前所在的目录位置
pwd

# 12.查看文件内容
cat 文件名

# 13.分页查看文件内容
more 文件名 或 cat 文件名|more

# 14.查看目录所占磁盘容量
du [-s] 目录
-s 不包含子目录

# 15.拷贝文件或目录到远程工作站
rcp [-r] 源地址 主机名:目的地址
-r 目录
rcp [-r] 主机名:目的地址 源地址
ftp 主机名 或 ftp ip地址
ftp> help

# 16.文件权限的设定
chmod [-R] mode name
chmode 755 dir1
chmode u+x file1
chmode o-r file2
rwx, u-user, g-group, o-other
chown -R 用户名 文件/目录名

# 17.检查自己所属的工作组名称
groups

# 18.改变文件或目录工作组所有权
chgrp [-R] 工作组名 name

# 19.改变文件或目录的最后修改时间
touch name

# 20.文件的链接
ln 老文件名 新文件名

# 21.文件中字符串的查询
grep string file
whereis command 显示命令路径
which command 显示命令路径 即别名
whatis command 命令功能的摘要
find search_path -name filename -print 搜寻指定路径下某文件的路径

# 22.比较文件或目录的内容
diff [-r] name1 name2

# 23.文件打印输出
setenv PRINTER sp
lpr [-P打印机名] 文件名
enscript [-P打印机名] 文件名

# 24.troff文件的打印
ptroff [-P打印机名] [-man] [-ms] 文件名

# 25.进程控制
ps [-aux] 查看进程
-x 查看系统中,属于自己的进程
-au 查看系统中,所有用户的进程
-aux 查看系统中,包含系统内部的及所有用户的进程
kill [-9] PID 终止进程
& 后台执行进程
Ctrl+Z暂停正在执行的进程,键入bg,将暂停进程置于后台继续执行
jobs 查看后台进程
kill %n n为后台作业号

# 26.shell变量
set 查看所有shell变量
echo $变量名 显示指定的shell变量
set var=value
unset var

# 27.别名
alis 查看自己目前定义的所有命令,及其别名
alis name 查看指定name命令的别名
alis name 'command line'
unalias name 删除别名

# 28.历史命令
set history=n 设定命令记录表的长度
history 查看命令记录表的内容
!! 重复执行前一个命令
!n 命令记录表的命令编号
!string 重复执行过的以string为起始的命令
!!:p显示前一个命令内容
^oldstring ^newstring 将前一个命令中old换成new并执行

# 29.文件的压缩
compress 文件名 压缩文件
compressdir 目录名 压缩目录
uncompress 文件名 解压缩文件
uncompressdir 目录名 解压缩目录
tar
-c 建立新的压缩文件
-r 添加文件到已经压缩的文件
-u 添加改变了和现有的文件到已经存在的压缩文件
-x 从压缩的文件中提取文件
-t 显示压缩文件的内容
-z 支持gzip解压文件
-j 支持bzip2解压文件
-v 显示操作过程
-k 保留源有文件不覆盖
-C 切换到指定目录
-f 指定压缩文件
tar -xvf test.tar.gz -C dir

# 30.管道命令的使用
命令1 | 命令2

# 31.输入/输出控制
命令 < 文件 将文件作为命令的输入
命令 > 文件 将命令的执行结果送到文件中
>! 覆盖写入
>& 屏幕上任何信息写入
>> 将结果附加写入

# 32.查看用户和用户名
who
finger
finger 用户名 或 finger 用户名@域名
su 用户名 改变用户名
who am i 查看登录时用户名

# 33.查看当前系统上所有用户
rusers

# 34.与某用户交谈
talk 用户名@主机名/ip地址

# 35.检查网络是否联通
ping 主机名/ip地址

# 36.电子邮件
mail -s "主题" 电子邮件地址 < 文件
mail 地址

2. Shell编程

1. 快速入门

hello.sh

1
2
#!/bin/bash
echo 'hello world!'
运行:
1
2
3
4
5
6
# 方法1
sh hello.sh

# 方法2
chmod +x hello.sh
./hello.sh
说明:
  • #!告诉系统脚本需要什么解释器来执行。
  • 扩展名.sh不强制要求。
  • 方法1直接运行解释器, hello.sh作为默认Shell解释器的参数。第一行可以去掉。
  • 方法2hello.sh作为可执行程序运行,Shell脚本第一行一定要指定解释器。
2. Shell变量
定义

Shell变量分为系统变量和自定义变量。系统变量有$HOME$PWD$USER等,显示当前Shell中所有变量:set

基本语法
  • 定义变量:变量名=变量值,等号两侧不能有空格,变量名一般大写。
  • 删除变量:unset 变量名 。
  • 声明静态变量:readonly 变量名,静态变量不能unset。
  • 使用变量:$变量名
将命令返回值赋给变量(重点)
  • A=`ls` 反引号,执行里面的命令
  • A=$(ls) 等价于反引号
3. Shell环境变量
定义
img
img
基本语法
  • export 变量名=变量值,将 Shell 变量输出为环境变量。

  • source 配置文件路径,让修改后的配置信息立即生效。

  • echo $变量名,检查环境变量是否生效

4. 位置参数变量
基本语法
  • $n :$0 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
  • $* :命令行中所有参数,且把所有参数看成一个整体。
  • $@ :命令行中所有参数,且把每个参数区分对待。
  • $# :所有参数个数。
5. 预定义变量
定义

在赋值定义之前,事先在 Shell 脚本中直接引用的变量。

基本语法
  • $$ :当前进程的 PID 进程号。
  • $! :后台运行的最后一个进程的 PID 进程号。
  • $? :最后一次执行的命令的返回状态,0为执行正确,非0执行失败。
6. 运算符
基本语法
  • $((运算式)) 或 $[运算式]
  • expr m + n 注意 expr 运算符间要有空格
  • expr m - n
  • expr *,/,% 分别代表乘,除,取余
实例
1
2
3
4
5
6
7
8
9
# 第1种方式 $(()) 
echo $(((2+3)*4))

# 第2种方式 $[],推荐
echo $[(2+3)*4]

# 使用 expr
TEMP=`expr 2 + 3`
echo `expr $TEMP \* 4`
7. 条件判断
基本语法

[ condition ] 注意condition前后要有空格。非空返回0,0为 true,否则为 false 。

实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash 
if [ 'test01' = 'test' ]
then
echo '等于'
fi

# 20是否大于10
if [ 20 -gt 10]
then
echo '大于'
fi

# 是否存在文件/root/shell/a.txt
if [ -e /root/shell/a.txt ]
then
echo '存在'
fi

if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world'
then
echo '条件满足,执行后面的语句'
fi
if基本语法
1
2
3
4
5
6
7
8
9
10
11
12
if [ 条件判断式 ];then   
程序
fi

# 或者(推荐)
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
case 分支
1
2
3
4
5
6
7
8
9
10
11
12
case $变量名 in
"值1")
如果变量值等于值1,则执行此处程序1
;;
"值2")
如果变量值等于值2,则执行此处程序2
;;
...省略其它分支...
*)
如果变量值不等于以上列出的值,则执行此处程序
;;
esac
for循环
1
2
3
4
5
6
7
8
9
10
11
# 语法1
for 变量名 in 值1 值2 值3...
do
程序
done

# 语法2
for ((初始值;循环控制条件;变量变化))
do
程序
done
while循环
1
2
3
4
while [ 条件判断式 ]
do
程序
done
8. 读取控制台输入
基本语法

read 选项 参数

选项
  • -p:指定读取值时的提示符
  • -t:指定读取值时等待的时间(秒),如果没有在指定时间内输入,就不再等待了。
参数
  • 变量名:读取值的变量名
实例

读取控制台输入一个num值。

1
2
3
4
5
6
7
#!/bin/bash

read -p "请输入一个数num1=" NUM1
echo "你输入num1的值是:$NUM1"

read -t 10 -p "请在10秒内输入一个数num2=" NUM2
echo "你输入num2的值是:$NUM2"

运行结果:

1
2
3
4
请输入一个数num1=10
你输入num1的值是:10
请在10秒内输入一个数num2=20
你输入num2的值是:20
9. 函数
自定义函数
1
2
3
4
5
6
7
8
[ function ] funname[()]
{
Action;
[return int;]
}

# 调用
funname 参数1 参数2...
实例

计算输入两个参数的和。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

function getSum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}

read -p "请输入第一个参数n1:" n1
read -p "请输入第二个参数n2:" n2

# 调用 getSum 函数
getSum $n1 $n2

3. vscode中的预定义的变量

${workspaceRoot} -VSCode中打开文件夹的路径 the path of the folder opened in VS Code
$ {workspaceFolder} -在VS Code中打开的文件夹的路径
$ {workspaceFolderBasename}-在VS Code中打开的文件夹名称,不带任何斜杠(/)
$ {file} -当前打开的文件
$ {relativeFile} -相对于当前打开的文件workspaceFolder
$ {relativeFileDirname} -相对于当前打开的文件的目录名workspaceFolder
$ {fileBasename} -当前打开的文件的基本名称
$ {fileBasenameNoExtension}-当前打开的文件的基本名称,没有文件扩展名
$ {fileDirname}-当前打开的文件的目录名
$ {fileExtname} -当前打开的文件的扩展名
$ {cwd} -启动时任务运行器的当前工作目录
$ {lineNumber} -活动文件中当前选择的行号
$ {selectedText} -活动文件中的当前选定文本
$ {execPath}-正在运行的VS Code可执行文件的路径
$ {defaultBuildTask} -默认构建任务的名称

4. Shell变量里的字符替换

1. 例子

假设我们定义一个变量为:file=/dir1/dir2/dir3/my.file.txt

${file#*/}:拿掉第一条/存在左边的字串:dir1 / dir2 / dir3 / my.file.txt
${file##*/}:拿掉最后一条/实际上左边的字串:my.file.txt
$ {file#*.}:拿掉第一个.其他左边的字串:file.txt
{file ## *。}:拿掉最后一个.其他左边的字串:txt
$ {file%/ *}:拿掉最后条/实际上右边的字串:/ dir1 / dir2 / dir3
$ {file %% / *}:拿掉第一条/实际上右边的字串:(空值)
$ {file%.*}:拿掉最后一个.另外右边的字串:/dir1/dir2/dir3/my.file
$ {file %%.*}:拿掉第一个.其他右边的字串:/ dir1 / dir2 / dir3 / my

2. 记忆的方法为:

是去掉左边(在键盘上$之左边)
是去掉右边(在键盘上$之右边)
单个符号是最小匹配﹔两个符号是最大匹配

3. 提取字节

$ {file:0:5}:提取最左边的5个字节:/ dir1
$ {file:5:5}:提取第5个字节右边的连续5个字节:/ dir2

4. 字串替换

$ {file / dir / path}:将第一个dir提换为path:/path1/dir2/dir3/my.file.txt
$ {file // dir / path}:将全部dir提换为path:/path1/path2/path3/my.file.txt

5. 针对不同状态赋值

利用$ {}可以针对不同的变量状态赋值(没设定,空值,非空值):
$ {file-my.file.txt}:如果$ file没有设置,则使用my.file.txt作传回值。(空值及非空值时不作处理)
$ {file:-my.file.txt}:如果$ file没有设置或为空值,则使用my.file.txt作传回值。(非空值时不作处理)
$ {file + my.file.txt}:假如$ file设置为空值或非空值,均使用my.file.txt作传回值。(没设定时不作处理)
$ {file:+ my.file.txt}:若$ file为非空值,则使用my.file.txt作传回值。(没设定及空值时不作处理)
$ {file = my.file.txt}:如果$ file没设定,则使用my.file.txt作传回值,同时将$ file赋值my.file.txt。(空值及非空值时不作处理)
$ {file:= my.file.txt}:如果$ file没设定或为空值,则使用my.file.txt作传回值,同时将$ file赋值my.file.txt。(非空值时不作处理)
$ {file?my.file.txt}:若$ file没设定,则将my.file.txt输出至STDERR。(空值及非空值时不作处理)
$ {file:?my.file.txt}:若$ file没设定或为空值,则将my.file.txt输出至STDERR。(非空值时不作处理)

6. 提示:

以上的理解在于,你一定要分清楚unset与null及non-null这三个赋值状态。
一般而言,:与null有关,若不带:的话,null不受影响,若带:则连null也受到影响。

还有哦,$ {#var}可计算出变量值的长度:
$ {#file}可得到27,因为/dir1/dir2/dir3/my.file.txt刚好是27个字节…

参考资料

  1. 《两个月精通Shell脚本》
  2. 掌握Shell变成,一篇就够了
  3. 超全整理!Linux shell及常用36类命令汇总
  4. vscode环境变量
  5. shell变量里的字符替换