目录
Shell概述
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
Linux系统的核心是内核(Kernal)。内核控制着计算机系统上的所有硬件和软件,在必要时为应用程序分配硬件, 并根据需要执行程序中的代码。
内核主要负责以下四种功能:
- 系统内存管理
- 软件程序管理
- 硬件设备管理
- 文件系统管理
简单来说Shell是一种特殊的交互式工具,核心是命令提示符,允许输入文本命令,解释命令,并在内核中执行命令。
Shell解析器
Linux提供的Shell解析器有:
[jachin@hadoop100 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin #仅不能执行登录功能
/bin/dash
/bin/tcsh
/bin/csh
不同的shell解析器,功能不同,比如csh,符合c语言风格的shell解析器。Centos默认使用的是/bin/sh 和 /bin/bash作为shell解析器
(2)bash和sh的关系
[jachin@hadoop100 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 5月 11 2016 bash
lrwxrwxrwx. 1 root root 4 5月 27 2017 sh -> bash
(3)Centos默认的解析器是bash
[jachin@hadoop100 bin]$ echo $SHELL
/bin/bash
脚本的执行
①声明: 脚本以 #!/bin/bash 开头(指定解析器)
②正文: 必须是shell解释器能否解释的命令
脚本的执行方式
- ① bash /sh + 脚本
特点: 新开一个bash执行脚本,一旦脚本执行完毕,bash自动关闭! - ② ./脚本,前提是当前用户对脚本有执行权限,使用当前默认的解释器执行脚本
特点: 新开一个bash执行脚本,一旦脚本执行完毕,bash自动关闭! - ③ source / . +脚本 使用当前默认的解释器执行脚本,并不要求当前用户对脚本有执行权限
特点: 在当前bash执行脚本
Shell中的变量
常用系统变量
$HOME、$PWD、$SHELL、$USER等
查看系统变量的值
[jachin@hadoop100 datas]$ echo $HOME
显示当前Shell中所有变量:set
[jachin@hadoop100 datas]$ set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
自定义变量
1.基本语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly变量,注意:不能unset
readonly : 用来修饰一个只读(不能修改,删除)变量!
export: 导出!将一个变量提升为全局变量!
局部变量: 默认变量只在定义变量的bash中有效!
如果希望在bash-a访问bash-b中定义的变量!
要求: ①bash-b不能关闭
②让bash-b将变量提升为全局变量,才能访问到!
2.变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
(5)使用双引号,可以识别空格之外的其他变量,使用单引号则会只会忽略空格!
(6)使用反引号,可以将语句运行的结果作为值赋值给变量!
变量的生命周期:
在第一次新增时产生
变量在执行unset时,撤销,失效!
关闭当前bash,所有定义的变量也不会存在!
特殊的变量
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$# (功能描述:获取所有输入参数个数,常用于循环)。
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
比较 $* 和 $@ 区别
(a) ∗ 和 *和 ∗和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2 … 2 … 2…n的形式输出所有参数。
(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2…n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2”…”n”的形式输出所有参数。
运算符
(1)$((运算式)) 或 $[运算式]
(2)expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格;
* 号需要转义为 \*,否则会被视为通配符;
运算指的都是整数的运算,浮点运算需要借助其他的命令!
举例:
计算 (1 + 1) * 2 - 3
expr `expr 1 + 1` \* 2 - 3
计算 ((1 + 1) * 2 - 3)* 2
expr $(expr `expr 1 + 1` \* 2 - 3) \* 2
条件判断
基本语法
[ condition ](注意condition前后要有空格)
注意:条件非空即为true(返回0),[ abc ]返回true,[] 返回false(返回1)。
常用判断条件
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than)
-le 小于等于(less equal)
-eq 等于(equal)
-gt 大于(greater than)
-ge 大于等于(greater equal)
-ne 不等于(Not equal)
(2)按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并是一个目录(directory)
-s 文件存在且不为空
-L 文件存在且是一个链接(link)
流程控制
if 判断
if [ 条件判断式 ]
then
程序
elif 条件判断式
then 程序..
else 程序..
fi
或
if [ 条件判断式 ] ; then
程序..
elif [条件判断式] ; then
程序..
else 程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
case 语句
1.基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
- case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
- 双分号“;;”表示命令序列结束,相当于java中的break。
- 最后的“*)”表示默认模式,相当于java中的default。
for 循环
1.基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
或
for (( 初始值;循环控制条件;变量变化 )); do 程序; done
foreach循环
for 变量 in 值1 值2 值3…
do
程序
done
或
for 变量 in 1 2 3; do 程序; done
或
for 变量 in {1..3}; do 程序; done
while循环
while [ 条件判断式 ]
do
程序
done
或
while((表达式))
do
程序
done
read读取控制台输入
基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名
系统函数
dirname基本语法
dirname 文件绝对路径
(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
basename基本语法
basename [string / pathname] [suffix]
(功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
自定义函数
Shell工具
wc
wc [选项参数] filename
选项参数 | 功能 |
---|---|
-l | 统计文件行数 |
-w | 统计文件的单词数 |
-m | 统计文件的字符数 |
-c | 统计文件的字节数 |
cut
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
1.基本用法
cut [选项参数] filename
说明:默认分隔符是制表符
选项参数 | 功能 |
---|---|
-f | f为fileds,列号,提取第几列 |
-d | d为Descriptor分隔符,按照指定分隔符分割列 |
切割ifconfig 后打印的IP地址
sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变, 除非你使用重定向存储输出。
sed [选项参数] ‘command’ filename
选项参数 | 功能 |
---|---|
-e | 直接在指令列模式上进行sed的动作编辑。 |
命令 | 功能描述 |
---|---|
a | 新增,a的后面可以接字串,在下一行出现 |
d | 删除 |
s | 查找并替换 |
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。默认情况以第一个字符串的字典顺序来排序!
sort(选项)(参数)
选项 | 说明 |
---|---|
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符,默认使用TAB |
-k | 指定需要排序的列 |
-u | u为unique的缩写,即如果出现相同的数据,只出现一行 |
参数:指定待排序的文件列表
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项参数 | 功能 |
---|---|
-F | 指定输入文件折分隔符 |
-v | 赋值一个用户定义变量 |
awk的内置变量(关键字)
变量 | 说明 |
---|---|
向屏幕输出内容 | |
$1-$n | 第n列 |
BEGIN | 代表开始读取文件内容之前,做什么事,初始化代码块 |
END | 代表开始读取文件内容之后,做什么事,结束代码块 |
FILENAME | 文件名 |
NR | 已读的记录数(行号) |
NF | 浏览记录的域的个数(切割后列的个数) |