目录
了解Shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson的sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Linux常见的shell
先查看一下本机的shell信息
[root@localhost data]#cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
bash:基于gun框架下发展的shell
csh:类似c语言的shell
tcsh:整合了csh提供了更多的功能
sh:已经被bash替换
nologin:这个shell可以让用户无法登录
bash(/bin/bash)是目前大多数Linux版本采用默认的shell
什么是shell脚本及构成
shell脚本就是将命令按顺序一一列出,最后自动执行;执行需要权限,也可以直接使用(绝对路径),脚本其实不复杂,通用脚本环境变量改变后依然可以使用的脚本,Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
构成
1、脚本声明(解释器),第一行开头"#!/bin/bash"表示此行以下的语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器“#!/bin/python、#!/bin/expect”
2、注释信息:以#开头的语句表示为注释信息
3、可执行语句:比如echo命令用于输出“ ”之间的字符串
脚本执行逻辑及执行方式
脚本执行逻辑
1、顺序执行:程序按上从下顺序执行
2、选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
3、循环执行:程序执行过程中需要重复执行多次某段语句
执行方式
1、指定路径去执行文件(需要执行权限)
[root@localhost data]#vim first.sh
直接执行会报没有权限
给一个执行权限,再执行就好了
[root@localhost data]#chmod +x first.sh
2、还可以指定解释器去执行(不需要权限)
[root@localhost data]#bash first.sh
Hello world
查看代码正确
有个错误脚本
bash -n 脚本名称(不在当前目录要加绝对路径),检查语法错误,并不执行脚本
[root@localhost data]#bash -n first.sh
bash -x 脚本名称(不在当前目录要加绝对路径),执行脚本,输出执行过程
[root@localhost data]#bash -x first.sh
+ echo=
+ 'Hello world'
first.sh:行5: Hello world: 未找到命令
shell脚本应用场景
⚫重复性操作
⚫交互性任务
⚫批量事务处理
⚫服务运行状态监控
⚫定时任务执行
............
重定向与管道操作
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备想用户输出数据
标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
[root@localhost data]#ll /dev/std* tty
重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有文件) |
2>> | 将错误信息追加到指定的文件中 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
例如改用户改密码,就可以用标准输入实现
[root@localhost data]#echo "123123" |passwd --stdin xiaobin
更改用户 xiaobin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
还可以用文件传输
[root@localhost data]#vim paswd.txt
[root@localhost data]#passwd --stdin xiaobin < paswd.txt
更改用户 xiaobin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost data]#cat paswd.txt
123123
多行重定向
在自动化运维中,常常需要shell脚本。在自动化创建脚本时,会遇到脚本内容里有用EOF重定向到配置文件的代码。
新建一个空白文件夹
[root@localhost data]#vim passwd.txt
编写一个脚本
[root@localhost data]#vim 2.sh
想新建文件传输东西即可
[root@localhost data]#cat passwd.txt
This is line 1 of the message.
This is line 2 of the message.
This is line 3 of the message.
This is line 4 of the message.
另外一种,没看懂全英文,没琢磨,有爱好的大佬可以https://linux.die.net/abs-guide/here-docs.html研究一下
变量
变量类型
自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用户设置工作环境
只读变量:只可以读取,不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:bash中内置的一类变量,不能自己修改
系统内置变量:PATH,UID,HOSTNAME
查看变量
[root@localhost data]#env
定义一个变量
输出结果
[root@localhost data]#bash mybin.sh
11 十一
使用变量递增
mybin=11
mybin=$[mybin+1]
#mybin2='十一'
echo $mybin
~
~
[root@localhost data]#bash mybin.sh
12
还可以结合read -p命令实现交互式的获取变量
[root@localhost data]#bash first.sh
Enter a number:b
b
删除一个变量
unset mybin
echo $mybin
[root@localhost data]#bash mybin.sh
有意思的是只读变量,不能修改,只可以让你看,需要一些牛逼的命令行操作才可以,一般没啥人用
readonly是定义只读变量
readonly mybin2=1
mybin2=$[mybin2+1]
echo $mybin2
unset mybin2
运行它会提醒你它是个只读变量 ,还不能删除
[root@localhost data]#bash mybin.sh
mybin.sh:行14: mybin2: 只读变量
1
[root@localhost data]#bash mybin.sh
mybin.sh:行14: mybin2: 只读变量
mybin.sh: 第 15 行:unset: mybin2: 无法反设定: 只读 variable
1
位置变量和预定义变量都是内部变量
写进脚本
#!/bin/bash
echo $0 #表示文件本身,当前执行的脚本或程序名称
echo $1
echo $2
echo $3 #位置变量(位置参数)
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo $@ #单输出,每一个都是独立的个体返回
echo $* #输出所有,表示所有位置参数内容看成一个整体返回
echo $? #表示前一条命令执行后的返回状态,返回值为0正确,返回值非0表示错误
echo $# #表示命令行中位置参数的个数
echo $$ #脚本进程的ID
echo $PPID #父进程id
运行脚本
shell字符串
赋值使用(“”)双引号,表示可以直接调用变量
赋值使用(‘’)单引号,$只会被认为是字符串$不会调用变量
赋值使用(``)反撇号,命令替换,提取命令执行后面输出结果,和$()用法相同
{}可以分隔变量值和普通值
生成随机数
[root@localhost data]#echo $[RANDOM]
30以内的随机数