目录
何为Shell
Shell是在Linux系统中运行的一种特殊程序
众所周知,我们说的话计算机是听不懂的
所以Linux“聘请”了Shell来在用户和内核之间之间充当“翻译官”
当我们登陆Linux系统时,就自动加载一个Shell程序
Bash是Linux系统中默认使用的Shell程序,bash是一个文件,linux系统中万物皆文件
bash文件位于/bin/bash,是目前大多数Linux版本采用的默认shell
Shell翻译官的日常打工流程:
计算机先接收用户所输入的的命令
然后全部交给Shell,让它把这些命令全部翻译成计算机所能识别的二进制语言
最后再将这些二进制语言传递给系统内核执行(调用计算机硬件资源)
用户登录后默认使用的Shell程序,一般为/bin/bash,当然翻译官不止Shell一位,不同Shell的内部指令、运行环境等都会有所区别
(注意,nologin是奇怪的shell,这个shell可以让用户无法登录主机。)
Shell脚本
shell脚本是啥
shell脚本就是说我们把原来需要一句一句敲的linux 命令或语句放在一个文件中,然后通过执行这个程序文件,使得计算机能瞬间完成我们需要完成的操作,也可以这样理解:
【在有些游戏中如果要完成某些连招,需要按照顺序释放不同的技能,但是有些连招实在太难或者太菜手残按不出来,这种时候他们可以设置一个类似shell脚本一样的东西,将需要按下的技能顺序写进一个程序,然后在需要的时候,只需要按一个键即可释放一整套连招,俗称宏,但是有些游戏内宏算是一种作弊,不建议使用宏,真正要变强还是得自己加以练习】
我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们凑合在一块儿就形成了一个功能强大的shell脚本
总结:将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的
在工作环境中Shell脚本具体都能干些啥
- 自动化完成软件的安装部署,如安装部署LAMP架构服务
- 自动化完成系统的管理,如批量添加用户
- 自动化完成备份,如数据库定时备份
- 自动化的分析处理,如网站访问量
- 重复性操作的工作
- 交互性任务
- 批量的事务处理
- 服务运行状态监控
- 定时任务的执行
Shell脚本的构成与编辑规范
编写脚本代码
- 使用vim文本编辑器
- 每行一条Linux命令,按执行顺序依次编写
- vim 【文件名】.sh
- 赋予可执行的权限
- chmod+x test.sh
脚本的构成
第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。
还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
可执行语句:如echo命令,用于输出“ ”之间的字符串
执行脚本的方式
./text.sh #相对路径
/root/text.sh #绝对路径
这两种方法都必须要有x执行权限
sh 脚本文件路径是不需要x执行权限的
source脚本文件路径
source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令,例如 . test.sh(.的前后都要空格)
不需要x权限,也需要使用相对路径或绝对路径
其他方法:(均不需要x执行权限)
sh < test.sh
cat test.sh | sh
bash test.sh
重定向与管道操作
交互式硬件设备
标准输入:从该设备接收用户输入的数据,设备文件为/dev/stdin,文件描述编号为0,默认设备为键盘
标准输出:通过该设备向用户输出数据,设备文件为/dev/stdout,文件描述编号为1,默认设备为显示器
标准错误:通过该设备报告执行出错信息,设备文件为/dev/stderr,文件描述编号为2,默认设备为显示器
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件中读取数据,而不是纯靠手打 |
重定向输出 | > | 将输出的结果保存到指定的文件中(注意:会覆盖原来的内容) |
>> | 将输出的结果追加到指定文件的尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(也会覆盖原来的内容,这个就更需要注意力) |
2>> | 将错误的信息追加到指定的文件 | |
混合输出 | &> | 将标准输出,标准错误的内容保存到同一个文件中 |
重定向操作
往里添加内容(注意,这里如果用>的话,就会把文件原来的内容给覆盖掉)
错误重定向
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符
作用:
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁
同样的,使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符
当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类信息输出信息保存到同一个文件
/dev/null:把它看作"黑洞",所有写入它的内容都会永远丢失,从它那儿读取内容则什么也读不到,然而 /dev/null 对命令行和脚本都非常的有用
&>和>&符号
&表示等同于的意思
1、将错误显示的内容和正确显示的内容分开
2、把正确的和错误的信息都保存到一个文件(混合模式)
3、另一种方法,把正确的和错误的信息都保存到一个文件(混合模式)
管道操作
管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。
$bash表示系统提示符,表示系统提示符,表示系统提示符,表示此用户为普通用户,超级用户的提示符是#
bash是shell的一种,是linux下最常用的一种shell
$bash的意思是执行一个子shell,此子shell为bash
Shell变量的作用、类型
变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量、只读变量、位置变量、预定义变量
自定义变量
变量名=变量值 #变量名以字母或下划线开头,区分大小写,建议全大写
echo $变量名 #查看变量的值
等号(=)用来给变量赋值
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值
引用变量
echo选项
echo-n表示不换行输出
使用echo -e输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:
\c不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo-n
\n 换行
\t 转义后表示插入tab,即制表符
注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\s将输出“$”符号,而不当做是变量引用
赋值时使用引号
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值, $视为普通字符
- 反撇号:命令替换,提取命令执行后的输出结果,``和$(…)作用相同
双引号允许通过$符号引用其他变量值
单引号禁止引用其他变量值, $视为普通字符
交互式定义变量(read)
read命令获取输入内容
-p:提示用户的信息
-n:定义字符数
-s:不显示用户输入的内容,常用于输入密码read -s -p "input your password:" pass
-t:定义超时时间,超过多长时间没输自动退出从文件读取内容赋值给变量(默认10s)
stty -echo //关闭屏幕回显
stty echo //开启屏幕回显
例如:read -p 提示信息 变量名
echo $变量名
设置变量的作用范围(export)
格式1:export 变量名
格式2:export 变量名=变量值
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或者新的子Shell环境时,局部变量将无法再使用。
例如:直接执行Bash进入下一个新的子Shell脚本后,将无法引用父级Shell环境中定义的变量
可以通过内部命令Export将指定的变量到处为全局变量。可以同时指定多个变量名称作为参数(不需要使用$符号),变量名之间以空格分隔。
使用export导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值。
例如:执行以下操作可以直接新建一个名为lc的全局变量
数值变量的运算
Shell变量的数值运算多用于脚本程序的过程控制。在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下所示。需要注意的是,运算符与变量之间必须有至少一个空格。
运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
运算符号:( ( ) ) 和 (( ))和(())和[]
运算命令: expr和let
运算工具: bc(计算器)
expr命令
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
expr 变量1 运算符 变量2 [运算符 变量3]...
变量运算
let命令
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。
let i++ #i自加1
let i-- #i自减1
[i++] #先输出后执行
[++i] #先执行后输出
bc命令
bc 命令是任意精度计算器语言,通常在linux下当计算器用(可以调用小数)
用echo结合管道使用命令
scale=2设小数位,2代表保留2位
特殊的Shell变量
环境变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件:/etc/profile(全局配置文件) 、~/.bash_profile(用户的独立配置文件)
常用的环境变量
位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
预定义变量
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用*$"符号和另一个符号组合表示,较常用的几个预定义变量的含义如下。
$#: 表示命令行中位置参数的个数。
$*: 表示所有位置参数的内容,这些内容当做一个整体
$@: 表示列出所有位置参数,但是是以单个的形式的列出
$?: 表示前一条命令执行后的返回状态,返回值为О表示执行正确,返回任何非О值均表示执行出现异常。
$0:表示当前执行的脚本或程序的名称
$$:表示返回当前进程的进程号
$!:返回最后一个后合进程的进程号
一键安装yum源仓库
求圆的面积