Linux Shell 笔记
此为做操作系统课程作业时,对shell语言的一些记录.
常用命令
ls列出文件-F区分文件类型-a显示隐藏文件-R显示文件夹子文件夹-l显示更多信息,按行排列- 过滤器:通配符筛选文件
touch创建文件-a改变修改时间
cp复制文件mv移动文件(重命名)cpsourcedestination-i提醒是否覆盖-R复制并创建目录
ln链接文件- 符号链接
ln -s data_file s1_data_file是两个独立的文件 - 硬链接
ln datafile linkfile两个相同的文件 - 修改一个文件的时候,其硬链接和符号链接都会被修改
- 符号链接
rm删除文件-i提示是否要删除-fforce删除-r递归删除子文件
mkdir创建目录-p同时创建多个目录和子目录
rmdir删除目录 只删除空目录tree显示目录树file查看文件类型cat显示文本数据-n加上行号-b给有文字的加上行号-T不让制表符出现
more显示长文本less更多功能的显示长文本工具tail查看文件尾部 head 查看文件头部ps查看进程-A-e显示所有进程-a显示除控制进程以外的和无终端进程外的所有进程-d显示除控制进程以外的所有进程-L显示进程中的线程-f完整输出--forest树状显示父子关系(linux)
top实时显示运行情况 检测资源使用kill结束进程-s指定信号kill -s HUP 3940killall通过进程名结束进程

- 挂载存储媒体
mount- 类型:
vfat ntfs ios9660 mount -t vfat /dev/sdb1 /media/disk- 卸载
umount
- 类型:
df查看挂载硬盘情况du显示该目录下所有文件-c显示文件大小-h用易读格式输出
- 排序数据
sort XXfile-n按照数值方式排序-M识别月份名排序
grep [option] pattern [file]在文件中查询某字符或模式-v反向搜索-c计行数-e多个模式
- 压缩单个文件
gzipgzip压缩文件gzcat查看压缩文件内容gunzip解压文件
tar归档压缩数据-c创建一个新的tar文件-r追加文件-t显示文件内容-f输出结果到什么目录或什么文件-x提取文件-z将输出重定向给gzip解压内容- 下载了开源软件之后,你会经常看到文件名以.tgz结尾。这些是gzip压缩过的tar文件可以 用命令
tar -zxvf filename.tgz来解压。
bash-c string运行某个命令-i启动交互bash-l登陆shell形式启动-r目录受限制的bash-s从标准输入中获取命令
进程命令
- 在一行中加分号依次运行一系列命令
pwd; ls; cd /etc; pwd
- 加上括号会使其成为进程列表,生成一个子shell来只执行命令
(pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls ; echo $BASH_SUBSHELL)
- 后台模式
- 将命令在后面加上
&进入后台模式运行 - 使用
ps或者jobs来查看后台作业 - 也可以讲进程列表置入后台
- 将命令在后面加上
- 协程
coproc sleep 10- 给进程起名字
coproc MyJob { sleep 10; }(Linux) 可用于通信
- 内建命令与外部命令 可以使用
type分辨- 外部命令会占据大量资源
history记录之前输入的命令!!上一条命令! num某一条命令
alias命令缩写输入工具- 创建自己的命令
alias name=cmd - 删除已有命名
unalias name
- 创建自己的命令
环境变量
全局变量VS局部变量
全局环境变量对所有的Shell及子Shell都可见;而局部环境变量仅对创建其的Shell可见.在变量名前加$来调用变量的值.
env或printenv查看全局变量,可用echo $HOME查看某个变量的值set可以显示为某个进程设定的所有环境变量,包括全局变量、局部变量和用户定义变量.
变量设置
设置用户变量
可以通过等号来对变量进行赋值
|
|
尽量遵循系统定义的变量使用大写,用户变量使用小写的规则.
设置全局变量
通过export将用户变量导出到全局变量中(不需要加$)
|
|
此时my_variable将成为一个全局变量.修改子shell中的全局变量不会影响父shell中的值.
删除环境变量
使用unset删除变量
|
|
$规则:使用变量时要加$,操作变量时不需要用.
除自之外,Bash有一些自带的环境变量.

设置PATH环境变量
在shell输入一个外部命令时,shell会查找PATH环境变量中的命令和程序来执行.
|
|
添加目录进入环境变量
|
|
这种修改只能保持到本次关机或者退出之前.
使得环境变量持久化
各个发行版下的shell有类似于/etc/bash.bashrc的配置文件,最常见的四种为
$HOME/.bash_profile$HOME/.bashrc$HOME/.bash_login$HOME/.profile
这些是Bash的启动脚本,在之中加入自己的环境变量即可以使得变量持久化
数组变量
同样可以定义数组环境变量,例如
|
|
Vim编辑器
基础操作
普通模式下
光标的移动
h 左移动光标
j 下移动光标
k 上移动光标
l 右移动光标
翻页
PageDown 或 Ctrl+F 下翻一页
PageUp 或 Ctrl+B 上翻一页
G 移到缓冲区最后一行
num G 移动到缓冲区第num行
gg 移到缓冲区第一行
命令行模式
q 未修改且退出
q! 取消修改并退出
w filename 保存到其他文件中
wq 保存并退出
编辑数据
x 删除当前字符
dd 删除当前行
dw 删除当前单词
d$ 删除至行尾
J 删除行尾的换行符
u 撤销
a 追加数据
A 在行尾追加数据
r char 用char替换光标当前字符
R text 用text覆盖当前位置数据 直到按下ESC
复制粘贴
y 复制
p 粘贴
查找与替换
/ text 查找某文本
/+Enter 或 n 查找下一个
:s/old/new/g 替换所有old
:n,ms/old/new/g 替换n行到m行之间的所有old
:%s/old/new/g 替换整个文件中的所有old
:%s/old/new/gc 替换整个文件中的所有old,但在每次出现时提示。
构建脚本
基础
脚本权限
对脚本赋予文件属主执行文件的权限 chmod u+x test
将脚本路径加入环境变量可以直接调用脚本
显示消息
echo 输出字符串
echo -n 将字符串输出在同一行(仅限于Bash) Mac可以通过\c实现
变量的使用
环境变量
在环境变量前加上$来使用环境变量,可以使用${variable}来严格规定变量名
用户变量
使用等号赋值,在变量、等号和值之间不能出现空格.
|
|
命令替换
使用反引号字符``或者$()来获取命令输出
|
|
命令替换获得日期并生成文件
|
|
警告
命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell 所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法 使用脚本中所创建的变量的。 在命令行提示符下使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候 不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。 在命令行提示符下运行脚本时一定要留心!
重定向输入输出
输出重定向
>完成将命令的输出发送到一个文件中,>>表示将内容追加到文件中
|
|
输入重定向
输入重定向恰好相反 command < inputfile
|
|
内联输入重定向
command << marker
在命令行上使用内联输入重定向时,shell会用PS2环境变量中定义的次提示符(参见第6章) 来提示输入数据。下面是它的使用情况。
|
|
管道(Pipe)
有时需要将一个命令的输出作为另一个命令的输入。这可以用重定向来实现,只是有些笨拙。
|
|
管道连接可以解决这个问题,|将一个命令的输出重定向到另一个命令中.
command1 | command2
Linux会同时运行两个命令,在系统内部连接起来,在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。
$ rpm -qa | sort | more
到目前为止,管道最流行的用法之一是将命令产生的大量输出通过管道传送给more命令。 这对ls命令来说尤为常见.
数学运算
expr命令
使用expr命令可以进行一些简单的数学运算
|
|
尽管标准操作符在expr命令中工作得很好,但在脚本或命令行上使用它们时仍有问题出现。 许多expr命令操作符在shell中另有含义(比如星号)。当它们出现在在expr命令中时,会得到一 些诡异的结果。
使用方括号
使用$[]处理数学表达式会更加方便
|
|
但是bash仅支持整数运算,zshell(zsh)提供了完整的浮点数算术操作,或者也可以使用bc来进行浮点运算.
退出脚本
查看退出状态码
shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态 码是一个0~255的整数值,在命令结束运行时由命令传给shell。可以捕获这个值并在脚本中使用。
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。对于需要进行检查的 命令,必须在其运行完毕后立刻查看或使用$?变量。它的值会变成由shell所执行的最后一条命令的退出状态码。
|
|
exit 命令
使用exit可以自行返回状态码
|
|
结构化命令
if-then
bash中最基本的结构化语句为
|
|
若if后的command返回状态码为0,则commands会运行,若返回状态码非0,则会跳过then中的内容.
同时,也有else语句,也有elif语句
|
|
|
|
test 命令
检查变量是否有内容
在if语句中看到的都是普通shell命令。你可能想问,if-then语句是否能测试 命令退出状态码之外的条件。
答案是不能。但在bash shell中有个好用的工具可以帮你通过if-then语句测试其他条件。 test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立, test命令就会退出并返回退出状态码0。这样if-then语句就与其他编程语言中的if-then语句
以类似的方式工作了。如果条件不成立,test命令就会退出并返回非零的退出状态码,这使得 if-then语句不会再被执行。
test命令的格式非常简单。 test condition
condition是test命令要测试的一系列参数和值。当用在if-then语句中时,test命令看 起来是这样的。
|
|
用test可以确定变量中是否有内容
也可以用[]替代test.
数值比较
|
|
字符串比较
通常需要添加转义字符
|
|
在比较测试中,大写字母被认为是小于小写字母的。但sort命令恰好相反。当你将同样的 字符串放进文件中并用sort命令排序时,小写字母会先出现。这是由各个命令使用的排序技术 不同造成的。
文件比较
文件比较是最常用,功能最强大的比较形式.
复合条件
可以用布尔逻辑&& ||来组合条件
|
|
If-then 高级特性
(()) 双括号命令允许在比较过程中使用高级数学表达式.
|
|
[[]] 双方括号允许在比较过程中使用字符串的高级特性.可以利用正则表达式来匹配模式.
|
|
case 命令
case命令在bash中格式为
|
|
也类似于其他语言中的case
|
|