Linux 认识与学习bash
shell简介
- 用户 -> Shell -> 内核 -> 硬件
- 我们必须通过Shell将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作。
- shell的功能只是提供用户操作系统的一个接口,因此shell需要可以调用其他软件才好。
- bahs 和 shell的关系:bash是shell的一种。是现在Linux发行版本中的标准shell
- 每当一个用户登录的时候,就会有一个shell来让我工作
shell 的种类
- 第一个shell是由Steven Bourne发展出来的。称为sh
- Bill Joy设计依附于BSD版的UNIX系统的shell,由于语法类似与C语言,所以称为 C shell,简称csh
- bash是Bourne shell的增强版本
在/etc/shells下可以看到本机可以使用的shell
shell的作用
- 系统管理。shell和shell scripts对于系统管理很重要
- 远程管理。命令行界面比较快。
命令别名设置
- 查看命令别名:alias
- 设置命令别名:alias lm=‘ls -al’
- 取消设置命令别名:unalias 命令别名
- 在注销bash之后,就会自动取消别名的设置
bash的内置命令:type
可以通过type命令来查看命令是否是bash内置的
shell的变量功能
什么是变量
- 变量就是以一组文字或符号等,来替代一些设置或者一串保留的数据。
- 环境变量:系统需要一些变量来提供它的数据的访问。为了区别自定义变量,这部分变量常是大写字符来表示。
变量的显示和设置:echo、unset
- 设置变量:myname=XXX (直接用等号连接)(注意不要有多余的空格符)
- 显示变量:echo m y n a m e ( 注 意 加 上 myname (注意加上 myname(注意加上)
- 取消变量:unset myname
- 如果有特殊字符,如$等。用双引号或者单引号把整个变量结合起来。
- 变量连接:myname="$myname"more_content(直接在后面添加,但是注意格式)
- 设置变量允许其他子进程执行:export myname(因为子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量)
单引号和双引号的区别
双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号
name=abc
echo $name
显示:abc
myname="$name is me"
echo $myname
显示:abc is me
myname='$name is me'
echo $myname
显示:$name is me
特殊符号“`”的使用
使用“`…`”扩起来的内容会优先执行。例如
cd /lib/modules/`unmae -r`/kernel
便会先执行unmae -r的内容。然后再处理整个数据
查看所有环境变量
env
其中:
- HOME:代表用户的主文件夹
- SHELL:指出我们目前环境使用的是哪个SHELL程序。Linux默认使用/bin/bash
- MAIL:当我们使用mail这个命令在收信时系统会去读取的邮件信箱文件
- PATH:执行文件查找的路径,目录与目录中间以冒号分割。
查看所有变量
set
其中:
- PS1表示提示符的设置。我们可以通过修改PS1的内容,来修改提示符
提示符:(命令行前面的显示)
[budding@budding ~]
具体修改方法可以查看man
-
: : :本身也是一个变量。代表目前这个shell的线程代号。
-
?:上个执行命令的回传码
变量键盘读取和声明
- 读取
read [-pt] variable
-p:后面可以接提示符
-t:后面可以接等待的“秒数”
示例:
- 声明
declare [-aixr] variable
- 后面什么都没有加,用法和set一样
-a:将后面的变量定义为数组类型
-i:将后面的变量定义为整数数字类型(目前最高精度是整数)
-x:用法和export一样,将后面的变量设置为环境变量
-r:设置变量为readonly。不可被修改
示例
个人觉得这个数组的声明在这里没有很大的作用,和普通变量类型。可能在shell script才会比较有用吧。
与文件系统及程序的限制关系:ulimit
列出所有的限制额度
ulimit -a
可以根据提示进行设置。例如设置最大的文件容量。可以使用下面的命令:
limit -f 10240
复原ulimit的设置最简单的方法就是注销之后再登录。
历史记录
使用命令
history [n] 查看最近n条命令
history [-c] 将目前shell中的所有history内容全部清除
- 当我们以bash登录Linux主机之后,系统会主动由文件夹的~/.bash_history读取以前曾经下过的命令。~/.bash_history会记录的条数和HISTSIZE这个变量设置值有关。
- 历史命令会在我注销的时候,将最近的HISTSIZE条记录到我的记录文件当中。
!number:执行第number条命令
!command:执行最近以command开头的命令
!!:执行最近的命令。
bash的命令查找顺序
- 以相对/绝对路径执行的命令。例如./ls
- 由alias找到该命令来执行
- 由bash内置的builtin命令来执行
- 通过$PATH这个变量的顺序找到的第一个命令来执行
数据流重定向
重定向就是将原本要出现在屏幕上的数据传输到其他的地方。
标准输入:代码为0,使用< 或者<<
标准输出:代码为1,使用> 或者>>
标准错误输出:代码为2,使用2> 或者2>>(注意区分标准输出,多了个数字2)
> 和>>的区别:>会直接重新覆盖原有内容。而>>会在最后追加
示例:
标准输出:
ll / > ~/rootfile
标准错误输出:
find /home -name .bashrc 2> errorlist
分别输出到不同文件
find /home -name .bashrc > list_right 2>errorlisr
对于不想处理的错误输出,可以扔到垃圾桶黑洞中:/dev/null
多条命令的执行
cmd; cmd;
cmd1 && cmd2
- cmd1执行完毕且正确执行,则开始执行cmd2
- cmd1执行错误,则cmd2不执行
cmd1 || cmd2
- cmd1执行正确,则cmd2不执行
- cmd1执行错误,则cmd2执行
管道命令
- 管道命令使用的是“|”这个界定符号。
- Command1(产生stdout,对于Command2来说的stdin)-> Command2
- 在每个管道后面接的第一个数据必定是“命令”,而且这个命令必须要能够接受standard input 的数据才行。
- 管道命令仅会处理standard output,对于standard error output会予以忽略。
- 管道命令必须要能够接受来自前一个命令的数据成为standard input继续处理才行。
选取命令:cut、grep
- cut:
介绍:这个命令可以将一段信息的某一端“切”出来,处理的信息以“行”为单位。
作用:以某些字符当作切割的参数,然后来将数据加以切割
cut -d '分割字符' -f fields
cut -c 字符范围
-d:后面接分割字符,与-f一起使用(不能单独使用)
-f:依据-d的分割字符将一段信息切割成为数段,用-f取出第几段的意思
-c:以字符的单位取出固定字符区间
示例:
//以“:”为分割,取出第3和第5条
echo $PATH | cut -d ':' -f 3,5
- grep
介绍:分析一行信息,若当中有我们所需要的信息,就将该行拿出来。
作用:解析一行文字,取得关键字,若该行有存在关键字,就会整行列出来
grep [-acinv] '查找字符串' filename
-a:将binary文件以text文件的方式查找数据
-c:计算找到“查找字符串”的次数
-i:忽略大小写的不同
-n:顺便输出行号
-v:反向选择。显示没有找到“查找字符串”内容的那一行
示例:
last | grep 'root'
排序命令:sort、wc、uniq
- sort
介绍:可以依据不同的数据类型来排序
sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写的差异
-b:忽略最前面的空格符部分
-n:使用“纯数字”来进行排序(默认是以文字类型来排序)
-r:反向排序
-u:就是uniq,相同的数据中,仅出现一行代表
-k:以那个区间来进行排序的意思
示例:
cat /etc/passwd | sort
- uniq
介绍:将重复的数据仅列出一个显示
last | cut -d ' ' -f1 | sort | uniq
- wc
介绍:计算输出的信息的整体数据
wc [-lwm]
-l:仅列出行
-w:仅列出多少字
-m:多少字符
双向重定向:tee
介绍:tee会同时将数据流送与文件和屏幕。(相当于同时流两份内容到不同地方,一份去文件,一份流向屏幕)
tee [-a] file
-a:以累加的方式
示例
last | tee last.list | cut -d ' ' -f1
字符转换命令
- tr
tr [-ds] SET1
-d:删除信息当中SET1这个字符串
-s:替换掉重复的字符
示例
所有小写变大写
last | tr '[a-z]' '[A-Z]'
- col
用途:col经常用于将man page转存为纯文本以方便查阅的功能。如示例所示:
col [-xb]
-x:将tab键转换成对等的空格键
示例:
可以使用cat -A file 显示出所有特殊键
man col > /root/col.man
- paste
用途:将两个文件的对应每一行,中间以tab键隔开拼成一行
paste [-d] file1 file2
-d:后面可以接分割字符,默认是以tab来分割的
- expand
将tab按键替换成空格键
expand [-t] file
-t:后面可以接数字,一般来说,一个tab按键可以用8哥空格键替换
-unexpand
将空白转成tab的命令
切割命令:split
split [-bl] file PREFIX
-b:后面可以接欲切割成的文件的大小,可加单位。例如b,k,m等
-l:以行数来进行切割
PREFIX:前导符,可以作为切割文件的前导文字
示例:
split -b 300k /etc/termcap termcap
会自动生成termcapaa、termcapab、termcapac等
合并:
cat termcap* >> termcapback
关于减号-的用途
可以用来代替命令间的stdin和stdout
示例:
tar -cvf - /home | tar -xvf -
前面一个’-‘代表tar -cvf产生的stdout
后面一个’-'代表取前面一个命令的stdout