0x00、shell
shell是一个命令解释器,它为用户提供一个向linux内核发送请求以便运行程序的界面系统即程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
硬件——内核——shell命令解释器——外层应用程序
最底层是硬件,通过内核来管理硬件,但是通过外层的应用程序或者认为敲入命令,内核是无法识别的,我们输入的命令是一串ascii字符串,而计算机能识别的是01机器语言,他们之前需要转换。shell主要就是用于转换。
shell除了做命令解释器之外,shell还是一个功能相当强大的编程语言,易编写。易调试,灵活性较强。shell是解释执行的脚本语言,在shell中可回忆直接调用linux系统命令。
shell的分类
Bourne shell:从1979年期Unux就开始使用Bourne shell,Bourne shell的主文件名为sh。
C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容,Bourne家族主要包括sh、ksh、Bash、psh、zsh,C家族主要包括csh、tcsh
Bash:Bash与sh兼容,现在使用的linux就是使用bash作为用户的基本shell。
vim /etc/shells查询linux支持的shell。
#!/bin/bash(#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。只能放在第一行,不是注释,代表一下写的是shell程序,后面再跟的#只能看作注释)
echo “hello world”
0x01、执行脚本
写完的shell脚本,需要去运行,常用的有一下两种。
1.赋予执行权限,直接运行
chmod 755 1.sh
./1.sh(相对路径和绝对路径都可)
2.通过bash调用执行脚本
bash 1.sh
0x02、历史命令的调用
使用上下键调用以前使用的历史命令
使用!n重复执行第n条历史命令
使用!!重复执行上一条命令
使用“!字符串”重复执行最后一条已该字符串结尾的命令
0x03、别名的使用别名 (别名最大的好处就是让命令按照自己的习惯使用)
alias 别名=‘原命令’ 设定命令别名 (重启消失)
unalias 别名 删除别名
vim /root/.bashrc 让别名永久生效
alias 查询命令别名
命令执行顺序:
第一顺位执行要用绝对路径或相对路径执行的命令。
第二顺位执行别名
第三顺位执行bash的内部命令
第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
bash常用快捷键
Ctrl + C:强制终止当前命令
Ctrl + L:清屏,相当于clear命令。
Ctrl + U:删除或剪贴光标之前的命令。
Ctrl + Y:粘贴Ctrl + U或Ctrl + K剪贴的内容。
Ctrl + R:在历史记录中搜索。
Ctrl + D:退出当前终端。
0x04、多命令顺序执行
;多个命令顺序执行,命令之间没有任何逻辑联系
&& 逻辑与,当前一条命令执行正确的时候才会执行后面的命令(./configure && make && make install)
|| 逻辑或,当前一条命令只想能够不正确的时候才会执行后一条命令 (命令&& echo yes || echo no)
0x05、通配符和特殊符号
通配符
? 匹配一个任意字符
* 匹配0个或多个任意字符,也就是可以匹配任何内容。
[] 匹配中括号中任意一个字符。如[abc]代表一定匹配一个字符,或者a,或者b,或者c
[-] 匹配中括号中任意一个字符,-代表一个范围。如[a-z]代表匹配一个小写字母。
[^] 逻辑非,表示匹配不是中括号内的一个字符。如[^0-9]代表匹配一个不剩数字的字符。
bash中其他特殊符号
‘’单引号:在单引号中所有的特殊符号,如$和、都是没有特殊含义的。
“”双引号:在双引号中特殊符号都没有特殊含义,但是$ ` \是例外,拥有调用变量的值、引用命令和转义的特殊含义。
``反引号:反引号括起来的内容是系统命令,在bash中会先执行它,和$()作用一样。
#:在shell中,#开头的行代表注释。
$:用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值。
\转义符:跟在\之后的特使符号将失去特殊含义,变为普通字符。如\$将输出$符号,而不当做是变量引用。
单引号和双引号的区别在于有些特殊字符,双引号有特殊含义,而单引号没有
$()括起来的内容是系统命令,在bash中会先执行它
0x06、变量
变量是计算机内存的单元,其中存放的值可以改变,当shell脚本需要保存一些信息时,如一个文件名或一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用的信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
变量设置规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
变量用等号连接值,等号左右两侧不能有空格。
变量的值如果有空格,需要使用单引号或者双引号包括。
在变量的值中,可以使用“\”转义符。
如果需要添加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或${变量名}包含。
如果是把命令的结果作为变量值赋予变量,则需要使用反引或$()包含命令。
环境变量名建议大写,便于区分。
变量分类
用户自定义变量
变量的名,变量的内容和作用都可以自己定义。
环境变量
这种变量中主要保存的是和系统操作环境相关的数据。
位置参数变量
这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
预定义变量
是bash中已经定义好的变量。变量名不能自定义,变量作用也是固定好的。
本地变量定义
本地变量在用户现在的shell生命期的脚本中使用。这个值只在用户当前shell生命期有意义。如果在shell中启动另一个进程或退出,此值将无效。这个方法的优点就是用户不能对其他的shell或进程设置此变量有效。
name=wt
变量叠加:
name=wt
name=”$aa”456
name=$(aa)789
变量调用
使用echo命令可以显示单个变量取值,并在变量名前加$
echo $name
变量查看
set(查看所有变量)
变量删除
使用unset命令清除变量。
unset name
环境变量
系统环境变量,变量名称是固定的,更改则失去作用了,但是可以修改值,环境变量的作用也是固定的,但是允许手工添加环境变量
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。
设置环境变量
export 变量名=变量值 (申明变量)
set 查询所有变量
env 查询环境变量
unset 变量名 (删除变量)
pstree 通过树结构查看当前的所有的父shell和子shell
系统常见环境变量
PATH:系统查找命令的路径
在linux中,执行文件要运行,不管是系统的执行文件,还是自己写的脚本,都必须用绝对路径和相对路径,但是系统命令并没有写命令就可以运行,就是因为环境变量的存在,新敲一个命令,它会现在这些系统的环境变量的路径中找,在所有的路径都没有找到,系统就会报错。
新建个hello.sh的脚本,通过cp命令复制到path下的任意一个路径中,就不用写路径可以直接运行,但是并不建议,建议用叠加的方式。
PATH=”PATH”:/root
0x07、位置参数变量位置参数变量作用
$nn为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#这个变量代表命令中所有参数的个数
$*和$@的区别
主要还是用来区分往脚本传的参数是独立的还是整体的,$*把所有参数当作一个整理,$@把每个参数当作一个变量
0x08、预定义变量
位置变量只是预定义变量其中的一种,只是内容比较多,单独拿出来预定义变量作用
$?最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
$$当前进程的进程号(PID)
$!后台运行的最后一个进程的进程号(PID)
&&,前一条命令正确执行,才能执行后一条命令,||,前一条命令错误执行,才执行后一条命令,归根到底还是判断$?是否为0,来判断前一条命令是否正确
find /root -name canshu1.sh & 中的&加上则表示后台的意思
0x09、数值运算与运算符
declare声明变量类型
declare【+/-】【选项】【变量】
-给变量设定类型属性
+取消变量的类型属性
-i将变量声明为整数型
-x将变量声明为环境变量
-p显示指定变量的被声明的类型
一:用declare将变量声明为数值型
二:使用expr或let工具进行
三:把运算符用$(()),即$双小括号括起来
0x10、运算符优先级运算符说明
13-,+单目负、单目正
12!,~逻辑非、按位取或补码
11*,/,%乘,除,取模
10+,-加、减
9<>按位左移、按位右移
8<=,>=,小于或等于、大于或等于、小于、大于
7==,!=等于、不等于
6&按位与
5^按位异或
4|按位或
3&&逻辑与
2||逻辑或
1=,+=,-=,*=,/=,%=,^=,|=,<<=,>>=赋值、运算且赋值
0x11、环境变量配置文件
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PSI、HOSTNAME等默认环境变量。
/etc/profile
~/.bash_profile
~/.bashrc
/etc/bashrc
/etc/profile.d/*.sh
/etc/profile的作用
USER变量
LOGNAME变量
MAIL变量
PATH变量
HOSTNAME变量
HISTSIZE变量
umask:
调用etc/progile.d/*.sh文件
~/.bash_profile的作用
调用了~/.bashrc文件
在PATH变量后加入了”$HOME/bin”这个目录
~/.bashrc的作用
定义了系统默认别名
调用/etc/bashrc
/etc/bashrc的作用
(不输入用户名密码,直接登录的环境变量)
PSI变量
umask
PATH变量
调用etc/progile.d/*.sh文件
需要注意的是,写在后面的会覆盖前面的环境变量