目录
一、shell概念:
因为内核不提供和用户的交互功能,所以需要一个程序提供这种功能,这种程序分为两种:命令行(CLI)和图形界面(GUI)
- 在类UNIX中,提供CLI的交互程序,我们统称为shell
- Shell脚本以#!/bin/bash 开头(指定解析器)
1.1、Linux下常用的命令行程序:
- bash :redhat 默认shell,开源,基于GPL
- dash :ubuntu 默认 shell
常见shell程序:
- /bin/bash 该用户可用shell进行人机交互(一般为root及普通用户)
- /sbin/nologin 该用户不可用shell进行人机交互(一般为系统用户)
1.2、命令行提示符
[ 登陆用户名@主机名 当前目录 ] #/$
- # 表示是 root 用户
- $ 表示是普通用户
- 方括号里的提示符是由PS1变量展示
1.2.1、查看命令提示符的格式
# echo $PS1
1.3、命令类型
1.3.1、内建命令
shell自带命令
1.3.2、外置命令
非shell自带,外部的一个可执行文件
- 判断一个命令式内建还是外置:# type 命令
- 查找一个命令的可执行文件路径: # which 命令
- 查找关键字文件位置(该指令只能用于查找二进制文件、源代码文件和man手册页): # whereis 命令
1.4、PATH变量
当我们执行一条命令时,shell程序就会在PATH变量指定的路径中,从左到右去寻找,如果没找到,则会提示找不到这个命令。
1.4.1、查看PATH值
# echo $PATH
1.4.2、查看缓存的命令
# hash (hits:表示命中的次数,也就是被执行了多少次)
1.4.3、清除缓存
(比如将/usr/bin/touch 命令移到其他位置,如果有缓存,还会到/usr/bin/目录下找touch 命令,则会报错,这时就需要清楚缓存)
# hash -r
1.5、shell脚本执行方法
1.5.1、采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
本质是 bash 解析器执行脚本,所以脚本本身不需要执行权限
1.5.2、采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
本质是脚本需要自己执行,所以需要执行权限
1.5.3、在脚本的路径前加上 . 或者 source
1.5.4、三种方法的区别
用sh或者bash执行脚本的时候
用. 或者 source 执行脚本的时候
前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则子 shell 关闭,回到父 shell 中。
第三种,也就是使用在脚本路径前加“.”或者 source 的方式,可以使脚本内容在当前shell 里执行,而无需打开子 shell!这也是为什么我们每次要修改完/etc/profile 文件以后,需要 source 一下的原因。
开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的当前变量,父 shell 是不可见的。
1.6、变量
1.6.1、系统定义变量
常用系统变量
$HOME、$PWD、$SHELL、$USER 等
显示所有变量
# set
查看系统变量
# env
1.6.2、自定义变量
1.6.2.1、基本语法和规则
- 定义变量:变量名=变量值,注意,=号前后不能有空格
- 撤销变量:unset 变量名
- 声明静态变量:readonly 变量,注意:不能 unset
- 单引号’’中,如果有$变量名称,不会输出变量值,双引号中会输出变量值
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建
议大写。
- 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或单引号括起来
1.6.2.2、将局部变量设置成全局变量
# export 变量名称
在父shell定义的全局变量,可以在子shell中查看,但是子shell中不能修改
1.6.2.3、只读变量
# readonly 变量名称=变量数值
查看所有只读变量
# readonly -p
1.6.3、特殊变量
1.6.3.1、$n
功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以
上的参数,十以上的参数需要用大括号包含,如${10}
1.6.3.2、$#
功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及
加强脚本的健壮性
1.6.3.3、$* 和 $#
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
1.6.3.4、$?
功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
1.7、运算符
$((运算式)) 或 $[运算式]
1.8、条件判断
基本语法
- test condition
- [ condition ](注意 condition 前后要有空格)
注意:条件非空即为 true,[ dasfdsa ]返回 true,[ ] 返回 false。
常用判断条件
- 两个整数之间比较
-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le 小于等于(less equal)
-gt 大于(greater than) -ge 大于等于(greater equal)
注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
- 按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
- 按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
- 多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一
条命令执行失败后,才执行下一条命令)
防止$1值为空时,程序报错
-a and -o or
1.9、流程控制
1.9.1、If判断
单分支
多分支
Tips:
- [ 条件判断式 ],中括号和条件判断式之间必须有空格
- if 后要有空格
1.9.2、case语句
Tips:
- case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
- 双分号“;;”表示命令序列结束,相当于 java 中的 break。
- 最后的“*)”表示默认模式,相当于 java 中的 default
1.9.3、for循环
练习:
练习:
1.9.4、while循环
1.10、read从控制台输入
基本语法、
1.11、函数
1.11.1、系统函数
1.11.1.1、basename
基本语法
basename [string / pathname] [suffix] (功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename 可以理解为取路径里的文件名称
选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
1.11.1.2、dirname
dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名
(非目录的部分),然后返回剩下的路径(目录的部分))
dirname 可以理解为取文件路径的绝对路径名称
1.11.2、自定义函数
基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
Tips:
- 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一
样先编译。
- 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将
以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
1.12、正则表达式
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文
本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。
二、相关命令
2.1、查看系统所有shell
# chsh -l 或 # cat /etc/shells
2.2、查看系统当前使用的shell
# echo $SHELL 或 # ps
2.3、查看当前shell的ID
# echo $$
三、相关操作
3.1、当想要退出当前的shell会话时
- 可以输入命令exit
- logout命令
- 使用快捷键Ctrl+D来结束会话、