shell
- 实际上这是个编程语言、脚本语言
shell命令解析器
- shell是个脚本语言,脚本语言就需要 解释执行,那么就有了shell命令解释器
- 查看linux上的命令解释器
cat /etc/shells
- Centos默认的解析器是bash
shell脚本开头格式
- 脚本以#!/bin/bash开头(用于指定解析器)
- 当然也可以直接不指定解析器,也就是不写这种东西(就用默认的解析器)
小demo
- 需求:创建一个Shell脚本,输出helloworld
- 案例实操:
创建文件:
然后开始粘贴内容:touch helloworld.sh vim helloworld.sh
执行脚本#!/bin/bash echo "helloworld"
bash helloworld.sh
shell脚本执行方式
- shell脚本可以直接在shell命令解释器直接执行,不需要编写成多命令文件
- 采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
sh+脚本的相对路径sh helloworld.sh
- 采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
- 首先要赋予helloworld.sh 脚本的+x权限
chmod 777 helloworld.sh 或者 chmod +x helloworld.sh
- 执行脚本
./helloworld.sh
注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
Shell中的变量
- 系统变量
- 常用系统变量
$HOME、$PWD、$SHELL、$USER等 - 案例实操
- 查看系统变量的值
echo $HOME
- 显示当前Shell中所有变量:set
set
- 查看系统变量的值
- 常用系统变量
- 自定义变量
- 基本语法
- 定义变量:变量=值
非常注意:等号两边不能有空格 - 撤销变量:unset 变量
- 声明静态变量:readonly变量,注意:不能unset
- export可把变量提升为全局环境变量,可供其他Shell程序使用,
- 定义变量:变量=值
- 变量定义规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
- 等号两侧不能有空格
- 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
- 变量的值如果有空格,需要使用双引号或单引号括起来。
- 基本语法
- 特殊变量
- $#
功能描述:获取所有输入参数个数,常用于循环 - $*
功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 - $@
功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 - $?
功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。 - $1,S2,S3
功能描述:第一个参数,第二个参数,S0是脚本的名字
- $#
运算符
- 基本语法
- “$((运算式))”或“$[运算式]”
- expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
条件判断
- [ condition ]
- 注意:condition前后要有空格
- 条件非空即为true,[ atguigu ]返回true,[] 返回false。
- 常用判断条件
- 两个整数之间比较
= 字符串比较 -lt 小于(less than) -le 小于等于(less equal) -eq 等于(equal) -gt 大于(greater than) -ge 大于等于(greater equal) -ne 不等于(Not equal)
- 按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write) -x 有执行的权限(execute)
- 按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file) -e 文件存在(existence) -d 文件存在并是一个目录(directory)
- 两个整数之间比较
流程控制-判断
- if
if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi
- 注意:[ 条件判断式 ],中括号和条件判断式之间必须有空格
- 注意:if后要有空格
- case
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
- case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
- 双分号“;;”表示命令序列结束,相当于java中的break。
- 最后的“*)”表示默认模式,相当于java中的default。
流程控制-循环
- for第一种用法
for (( 初始值;循环控制条件;变量变化 )) do 程序 done
- for第二种用法
for 变量 in 值1 值2 值3… do 程序 done
- while
while [ 条件判断式 ] do 程序 done
read读取控制台输入
- 语法
read(选项)(参数) 选项: -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)。 参数 变量:指定读取值的变量名
函数
- 系统函数
- basename
- dirname
- 自定义函数
[ function ] funname[()] { Action; [return int;] }
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
- 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
shell工具
- cut
cut [选项参数] filename 说明:默认分隔符是制表符 选项参数 功能 -f 列号,提取第几列 -d 分隔符,按照指定分隔符分割列
- sed
- sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
- 用法
sed [选项参数] ‘command’ filename 选项参数 功能 -e 直接在指令列模式上进行sed的动作编辑。 命令 功能描述 a 新增,a的后面可以接字串,在下一行出现 d 删除 s 查找并替换
- awk
- sort