学习视频:尚硅谷Shell教程(shell自动化编程精讲)
真正的大师永远保持着一颗学徒的心
目录
第一章 Shell概述
大数据程序员为什么要学习Shell编程?
- 需要看懂运维人员编写的Shell程序
- 偶尔会编写一些简单Shell来管理集群、提高开发效率
Shell概述
Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
第二章 Shell解释器
注意:本文全局使用的是树莓派
(1)linux提供的Shell解析器
pi@raspberrypi:~ $ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
(2)bash和sh的关系
pi@raspberrypi:~ $ ls -l /bin | grep bash
-rwxr-xr-x 1 root root 925124 4月 18 2019 bash
lrwxrwxrwx 1 root root 4 4月 18 2019 rbash -> bash
lrwxrwxrwx 1 root root 4 5月 15 21:49 sh -> bash
(3)树莓派默认的解释器是
pi@raspberrypi:~ $ echo $SHELL
/bin/bash
第三章 Shell脚本入门
1. 脚本格式
脚本以#!/bin/bash
开头(指定解释器)
2. 第一个脚本:Hello World
#!/bin/bash
echo "Hello World";
执行
# 第一种
sh first.sh
# 第二种
pi@raspberrypi:~/Documents/shell $ sudo chmod 777 first.sh
pi@raspberrypi:~/Documents/shell $ ./first.sh
第一种执行方法本质是bash解释器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法本质是脚本需要自己执行,所以需要执行权限
3. 第二个脚本:多命令处理
在/home/pi/Templates
创建一个txt文件,向里面写入数据
#!/bin/bash
cd /home/pi/Templates
echo "The second shell application" > temp.txt
第四章 Shell的变量
系统变量
1. 常用的系统变量
S H E L L 、 SHELL、 SHELL、HOME、 P W D 、 PWD、 PWD、USER等
pi@raspberrypi:~/Documents/shell $ echo $PWD
/home/pi/Documents/shell
pi@raspberrypi:~/Documents/shell $ echo $HOME
/home/pi
自定义变量
基本语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明一个静态变量:readonly 变量
,注意:不能unset
(4)把变量提升为全局环境变量:export 变量
定义变量的规则
(1)变量名称可以有字母、数字、下划线组成,但是不能以数字开头,环境变量名建议大写
(2)等号两边不能有空格
(3)在bash中,变量的默认类型都是字符串类型,无法直接进行数值运算
(4)变量的值如果有空格,需要使用双引号或单引号括起来
案例实操
#!/bin/bash
a=1
echo "a:"$a
unset a
echo "a:"$a
readonly b=2
echo "b:"$b
unset b
echo "b:"$b
pi@raspberrypi:~/Documents/shell $ sh third.sh
a:1
a:
b:2
third.sh: 第 9 行:unset: b:无法取消设定: 只读 variable
b:2
特殊变量:$n
n为数字,$0代表该脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 使 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数需要使用大括号包含,如 9代表第一到第九个参数,十以上的参数需要使用大括号包含,如{10}
#!/bin/bash
echo "0:"$0
echo "1:"$1
echo "2:"$2
echo "3:"$3
pi@raspberrypi:~/Documents/shell $ sh fifth.sh
0:fifth.sh
1:
2:
3:
pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c
特殊变量:$#
获取所有输入参数的个数,常用于循环
#!/bin/bash
echo "0:"$0
echo "1:"$1
echo "2:"$2
echo "3:"$3
echo "个数"$#
pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c
个数3
特殊变量: ∗ , *, ∗,@
$*
:这个变量代表了命令行中所有的参数,$*
把所有参数看成一个整体
$@
:这个变量也代表了命令行中所有的参数,不过$@
把每个参数区分对待
#!/bin/bash
echo "0:"$0
echo "1:"$1
echo "2:"$2
echo "3:"$3
echo "个数"$#
echo *:$*
echo @:$@
pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c
个数3
*:a b c
@:a b c
特殊变量:$?
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体哪个数由命令自己决定),则证明上一个命令执行不正确
pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c
个数3
*:a b c
@:a b c
pi@raspberrypi:~/Documents/shell $ echo $?
0
第五章 运算符
基本语法
(1)$((运算式))
或$[运算式]
(2)expr +,-,\*,/,%
加减乘除取余
expr的数字与运算符之间要有间隔
案例实操
pi@raspberrypi:~/Documents/shell $ expr 2 \* 2
4
pi@raspberrypi:~/Documents/shell $ expr 2 + 2 \* 2 % 2
2
pi@raspberrypi:~/Documents/shell $ expr `expr 2 + 3` \* 4
20
pi@raspberrypi:~/Documents/shell $ s=$[(2+3)*4]
pi@raspberrypi:~/Documents/shell $ echo $s
20
第六章 条件判断
基本语法
[ condition ]
(注意:condition前后要有空格)
注意:条件非空即为true,[ condition ]
为true,[]
为false
常用判断条件
(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)
(4)多条件判断
&& 表示前一条命令执行成功时,才执行后一条命令
|| 表示前一条命令执行失败后,才执行后一条命令
案例实操
pi@raspberrypi:~ $ [ 1 -eq 2 ]
pi@raspberrypi:~ $ echo $?
1
pi@raspberrypi:~ $ [ 1 -eq 1 ]
pi@raspberrypi:~ $ echo $?
0
pi@raspberrypi:~/Documents/shell $ ls -l
总用量 20
-rw-r--r-- 1 pi pi 97 7月 25 13:37 fifth.sh
-rwxrwxrwx 1 pi pi 32 7月 25 10:20 first.sh
-rw-r--r-- 1 pi pi 60 7月 25 10:31 second.sh
-rw-r--r-- 1 pi pi 29 7月 25 10:31 temp.txt
-rw-r--r-- 1 pi pi 94 7月 25 12:09 third.sh
pi@raspberrypi:~/Documents/shell $ [ -r fifth.sh ]
pi@raspberrypi:~/Documents/shell $ echo $?
0
pi@raspberrypi:~/Documents/shell $ [ -x fifth.sh ]
pi@raspberrypi:~/Documents/shell $ echo $?
1
pi@raspberrypi:~/Documents/shell $ [ -f fifth.sh ]
pi@raspberrypi:~/Documents/shell $ echo $?
0
pi@raspberrypi:~/Documents/shell $ [ -f fifth ]
pi@raspberrypi:~/Documents/shell $ echo $?
1
pi@raspberrypi:~/Documents/shell $ [ 1 -eq 1 ] && echo OK || echo nook
OK
pi@raspberrypi:~/Documents/shell $ [ 1 -eq 1 ] && [ ] || echo nook
nook
第七章 流程控制(重点)
if判断
if [ condition ];then
# 程序
fi
或者
if [ condition ]
then
# 程序
fi
注意
(1)[ condition ]
中空号和condition中间一定要有空格
(2)if后要有空格
#!/bin/bash
if [ $1 -eq 1 ];then
echo "等于一"
elif [ $1 -eq 2 ];then
echo "等于二"
fi
pi@raspberrypi:~/Documents/shell $ bash seven.sh 1
等于一
pi@raspberrypi:~/Documents/shell $ bash seven.sh 2
等于二
case语句
case $变量名 in
"值1")
# 如果变量的值等于值1,则执行
;;
"值2")
# 如果变量的值等于值2,则执行
;;
# ..省略其他分支..
*)
# 如果变量的值不是以上的值,则执行
;;
esac
注意
(1)case行尾必须为单词in
,每一个模式匹配必须以右括号)
结束
(2)双分号;;
表示命令序列结束,相当于java的break
(3)最后的*)
表示默认模式,相当于java的default
#!/bin/bash
case $1 in
"1")
echo "The value is 1"
;;
"2")
echo "The value is 2"
;;
*)
echo "The value is null"
;;
esac
pi@raspberrypi:~/Documents/shell $ bash case.sh 1
The value is 1
pi@raspberrypi:~/Documents/shell $ bash case.sh 2
The value is 2
pi@raspberrypi:~/Documents/shell $ bash case.sh 3
The value is null
for循环
第一种语法
for (( 初始值;循环控制条件;变量变化 ))
do
# 程序
done
#!/bin/base
s=0
for (( i=0;i<=100;i++ ))
do
s=$[ $s + $i ]
done
echo $s
pi@raspberrypi:~/Documents/shell $ bash for.sh
5050
第二种语法
for 变量 in 值1 值2 值2 ...
do
# 程序
done
#!/bin/bash
for i in $*
do
echo "i:$i"
done
pi@raspberrypi:~/Documents/shell $ bash foreach.sh 1 2 3 4 5 6
i:1
i:2
i:3
i:4
i:5
i:6
While循环
while [ condition ]
do
# 程序
done
#!/bin/bash
s=0
num=0
while [ $num -lt 100 ]
do
num=$[ $num + 1 ]
s=$[ $s + $num ]
done
echo "count:$s"
pi@raspberrypi:~/Documents/shell $ sh while.sh
count:5050
第八章 read读取控制台输入
基本语法
read(选项)(参数)
选项:
- -p:指定读取值时的提示符;
- -t:指定读取值时等待的时间(秒)
参数:
- 变量:指定读取值的变量名
案例实操
#!/bin/bash
read -p "Input your name in 7 second:" -t 7 NAME
echo "You name is "$NAME
pi@raspberrypi:~/Documents/shell $ sh read.sh
Input your name in 7 second:Esion
You name is Esion
第九章 函数
系统函数
basename [string/pathname] [suffix]
basename命令会删除掉所有的前缀包括最后一个/
字符,然后将字符串显现出来
[suffix]
为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
pi@raspberrypi:~/Documents/shell $ basename /home/pi/Documents/shell/seven.sh
seven.sh
pi@raspberrypi:~/Documents/shell $ basename /home/pi/Documents/shell/seven.sh .sh
seven
dirname 文件的绝对路径
从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录的部分)
pi@raspberrypi:~/Documents/shell $ dirname /home/pi/Documents/shell/seven.sh
/home/pi/Documents/shell
自定义函数
[ function ]funname[()]
{
Action;
[return int;]
}
funname
注意
(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会想其他语言一样先编译
(2)函数返回值,只能通过$?
系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为 返回值,return后跟数值n(0-255)
#!/bin/bash
function sum()
{
s=$[ $1 + $2 ]
return $s
}
read -p "Please first number:" first
read -p "Please second number:" second
sum $first $second
echo "count:"$?
pi@raspberrypi:~/Documents/shell $ bash function.sh
Please first number:3
Please second number:1
count:4
第十章 Shell工具(重点)
cut
cut的工具就是“剪”,具体的说就是在文件中负责剪切数据用的,cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
cut [选项参数] filename
默认分隔符是制表符
参数说明
选项参数 | 功能 |
---|---|
-b | 以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 |
-c | 以字符为单位进行分割。 |
-d | 分隔符,按照指定分隔符分割分割列 |
-f | 列号,提取第几列 |
-n | 取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除 |
pi@raspberrypi:~/Documents/shell $ cat temp.txt
The 1 shell application
The 2 shell application
The 3 shell application
The 4 shell application
The 5 shell application
pi@raspberrypi:~/Documents/shell $ cut -b 5 temp.txt
1
2
3
4
5
pi@raspberrypi:~/Documents/shell $ cut -d " " -f 1 temp.txt
The
The
The
The
The
pi@raspberrypi:~/Documents/shell $ cut -d " " -f 1,2 temp.txt
The 1
The 2
The 3
The 4
The 5
sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出
sed [选项参数] 'command' filename
参数列表
选项参数 | 功能 |
---|---|
-e | 直接在指令列模式上进行sed的动作编辑 |
命令 | 功能描述 |
---|---|
a | 新增,a的后面可以接字符串,在下一行出现 |
d | 删除 |
s | 查找并替换 |