shell的基本概述和规范
shell面向的对象
面向过程语言
(开发的时候,需要一步一步的执行)
-
做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如果出现了情况B,做什么处理
-
问题规模小,可以步骤化,按部就班处理
-
以指令为中心,数据服务于指令
-
c,shell
面向对象语言(开发的时候将任务当作一个整体)
-
将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能.
-
一种认识世界、分析世界的方法论。将万事万物抽象为各种对象
-
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合
-
对象是类的具象,是一个实体
-
问题规模大,复杂系统
-
以数据为中心,指令服务于数据
-
java,python,golang等 云 go k8个字母s 平台
shell的概述
是将人类使用的高级语言转换成二进制,也可以将二进制翻译成高级语言。
人类写了个命令集合,用bash(shell)去翻译给硬件执行。
shell脚本的概念
-
将要执行的命令按顺序保存到一个文本文件
-
给该文件可执行权限
-
可结合各种shell控制语句以完成更复杂的操作
shell脚本应用场景
-
重复性操作
-
交互性任务
-
批量事务处理
-
服务运行状态监控
-
定时任务执行
shell编程规范
编写脚本代码
-
使用vim文本编辑器
-
每行一条linux命令,按执行顺序一次编写
shell脚本的组成(脚本名最好以.sh结尾,shell语法会高亮)
1.脚本申明(解释器):第一行开头“#! /bin/bash”。表示此行以下的代码语句是由shell语言编写
2.注释信息:以#开头的语句表示为注释信息。
3.可执行语句:比如echo命令用于输出“ ”之间的字符串。
shell执行脚本
1.直接调用shell解释器加上脚本的名字,bash + 脚本名 。不需要加权限
2.路径/脚本 路径:绝对路径或相对路径,而且需要x权限(加上执行权限:chmod +x 文件名)
3.source(.) 加脚本名字(不建议使用,会修改当前bash环境)
如果你想让脚本全局运行或者可以补全,要将脚本放入$PATH路径下
使用1和2执行脚本,是会新开一个bash环境去执行,不影响当前bash环境,而如果使用3去执行脚本,会直接在当前环境执行。
脚本执行逻辑和执行方式
脚本执行逻辑
1.顺序执行:程序按从上到下顺序执行
2.选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行。
3.循环执行:程序执行过程中需要重复执行多次某段语句。
脚本错误及调试
1.命令错误:不会影响接下来的命令执行,但是本条错误的命令不执行。
bash -x 脚本:模拟执行后,发现错误
2.语法错误:直接导致脚本无法运行。
bash -n 脚本:检查语法错误(在哪一行错了)(出错的行数不一定是正确的,上下左右)
3.逻辑错误:只能自己去筛查
shell脚本(安全选项)
set -e:在脚本里加,一旦出错立即停止
set -u:变量不存在不让执行
变量:如:dir =/opt
重定向与管道操作
--stdin管道操作
将管道符号“ | ”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道
管道符“|”
将第一个命令的结果当作后一个命令的处理对象。
pa aux |wc -l echo "abc123" |passwd --stdin zhangsan
重定向(标准输出、错误输出、标准输入)
默认电脑数据的输出方向是屏幕
1.标准输出:
你发了一条指令给电脑操作, 电脑会回复结果给你,结果是一定显示在屏幕上,称为标准输出
2.错误输出:
如果电脑没有正确回复,称为错误输出
3.标准输入:
我们通过 键盘 标 扫描仪 话简 等设备输入给电脑的指令
交互式硬件设备
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
重新定向操作:改变输出方向
1.输出到别的终端设备(tty查看本机名)
2.输入到文件中
“ > 覆盖”
“ >> 添加”
类型 | 操作符 | 用途 |
---|---|---|
重新定向输入 | < | 从指定文件读取数据 |
重新定向输出 | > | 将标准输出结果保存到指定的文件,并且覆盖原有文件 |
>> | 将标准输出结果添加到指定文件的末尾,不覆盖原有内容 | |
标准错误输出 | 2> | 将错误信息保存到指定文件,并且覆盖原有的文件 |
2>> | 将错误信息追加到指定文件尾部,不覆盖原有内容 | |
混合输出 | &> | 将标准输出,标准错误保存到同一文件中 |
2>&1 | 将标准错误输出重新定向到标准输出 |
useradd zhangsan #创建一个用户 echo"123456" > zhangsan.txt #把密码输出到文件 passwd --stdin zhangsan < zhangsan.txt #从文件里读取密码 命令输错了会报错,当不想看到报错时,可以把它藏到文件里显示 如:li 2> aaa.txtcat查看就可以查看到报错了li 2>> aaa.txt #同上性质,只是会添加不会覆盖la &>> aaa.txt #同样>>,只会添加不会覆盖ll &> aaa.txtll > aaa.txt 2>&1 #2>&1效果和&>一样
shell脚本变量
变量的作用:用来存放系统和用户需要使用的特定参数
变量:值可以变化的
常量:值不可以变化
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
shell不分数据类型(统一将所有的数据类型看作字符串)
变量的类型
1.自定义的变量:由用户自己定义、修改和使用
2.预定义变量 :bash中内置的一类变量
3.环境变量 :由系统维护,用于设置工作环境
env可以看到所有环境的变量
4.只读变量:常量
只可以读不可以改
5.位置变量:通过命令行给脚本程序传递参数
自定义变量
要求 | 方式 |
---|---|
设置变量 | 变量名=变量值 两边没有空格 |
调用变量 | echo $变量名 |
删除变量 | unset 变量名 |
重新定义变量 | 变量名=变量值 |
追加变量值 | 变量名+=变量值 |
命名要求
-
区分大小写
-
不能使程序中的保留字和内置变量: 如: if,for,hostname 命令 a=
-
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线“ - ”,和主机名相反
-
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
-
大驼峰StudentFirstName
-
小峰studentFirstName
-
下划线 student_name
变量的特殊符号
${}:定义了变量名的范围
“ ” :变量在双引号里可以识别,弱引用
‘ ’ :变量在单引号里不被识别,强引用
``:反撇号,代表调用命令执行的结果,同理别名。将一串命令重新定义,效果等于$( )
name=hyh #变量名=变量值 age=233 #变量名=变量值 echo "$name $age" hyh 233 echo '$name $age' #单引号内$视为普通字符 $name $age echo $(ls /opt) 123 rh#反撇号和括号使用结果都一样,提取命令执行后的结果 echo 'ls /opt' 123 rh
变量追加值
格式:title=cto
title+=ylc #变量名+=追加值
[root@localhost opt]# hyh=原神 [root@localhost opt]# hyh+=启动 [root@localhost opt]# echo $hyh 原神启动 修改环境变量: PATH+=:/data vim /etc/profile PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data"
查看变量的值:
echo $变量名
name=hyh #变量名=变量值 age=233 #变量名=变量值 echo $name$age hyh233#输出多个变量的值加空格和不加空格的区别 echo $name $age hyh 233 #如果变量名后跟了别的字符传,记得把变量名加上大括号区别开 如: echo ${name}$age hyh233 echo ${name} $age hyh 233 echo ${name}lisi hyhlisi echo ${name} lisi hyh lisi
变量作用范围
-
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时,局部变量将无法再使用
-
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用
设置变量的作用范围(临时的)
格式1:export 变量名
格式2:export 变量名=变量值 (指定该变量在任何环境下都能使用)
-
可以使用pstree 查看shell的环境
-
输入bash进入子shell环境
-
ctrl+D组合键或者输入exit 命令,退出子shell环境
整数的运算
expr只能进行整数的运算 格式:expr 变量1 运算符 变量2[运算符 变量3] 运算符 : 加法 + 减法 - 乘法 \ * 除法 / 取余 %
let sum=1+2 echo $sum 3
let var=算术表达式 let sum=1+2 sum=1+2$((var=算术表达式))和上面等价 ((sum=1+2)) echo $sumvar= S[算术表达式] var=$(expr argl arg2 arg3 ...) var= expr argl arg2 arg3...' echo'算术表达式’ |bc sum=$[ ] 计算
[root@test1 ~]# vim ji.sh #!/bin/bash read -p "请输入第一个整数" num1 read -p "请输入第二个整数" num2 #执行加法运算 sum=`expr $num1 + $num2` echo "运算结果为$sum" [root@test1 ~]# chmod +x ji.sh [root@test1 ~]# ./ji.sh 请输入第一个整数6 请输入第二个整数9 运算结果为15
环境变量
-
环境变量由系统提前创建,用来设置用户的工作环境
-
使用env命令可以查看到当前工作环境下的环境变量
-
变量USER表示用户名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录
-
变量PATH表示可执行程序的默认搜索路径
/etc/profile
#只要开机或者用户登录就下载里面的配置文件
/etc/bashrc
#每次用户登录的时候也会加载里面的配置,主要是加载功能和别名用的
~/.bashrc
#当前用户每切换一次shell环境都会自动执行,会加载/etc/bashrc
~/bash_profile
#每次用户登录的时候也会加载里面的配置,主要是加载功能和别名用。
修改环境变量:
PATH+=:/data #将/data目录添加到搜索路径 echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data export PATH=:/data #输出全局变量
环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户,在每次电脑开机时都会加载这个文件。每个用户还有自己的独立配置文(~/.bash_profile)。可以用来长期变更或设置某个环境变量
预定义变量(前面加echo显示)
bash 帮你定义好了 拿来用就可以了
$?:表示上一条命令执行后的返回状态,返回值0表示执行正确,非0值则表示出现异常。
$#:表示命令行中位置参数的个数
$0:表示当前执行的脚本或程序的名称
$$:表示当前bash的pid
$!:后台任务最后一个id
$*:代表返回所有参数(所有参数当成一个整体返回)
$@:代表返回所有参数(每个参数是独立的个体)
位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
#!/bin/bash echo "$1" 位置1 echo "$2" 位置2 echo "${10}" 位置10 echo "$10" 位置1和0 echo "$*" 将所有项当成一个值 echo "$@" 所有项 echo "$0" 脚本自身 echo "$#" 后面参数的个数 [root@test1 ~]# ./1.sh {1..10} 1 2 10 10 1 2 3 4 5 6 7 8 9 10
变量的命令
bash
相当于一个多开的桌面
显示当前bash的pid号:echo $$
readonly
命令设置只读变量(无法修改无法删除)
product=benet readonly product #设置为只读变量 echo $product product=accp #只读变量不可以被重新赋值 unset product #只读变量不可以被删除,unset命令用于删除变量
read命令获取输入内容
方法一: read -p "提示信息" 变量名 echo $变量名
方法二: echo -n “提示信息” read变量名 echo $变量名
read -p "你在干什么?" you #定义you这个变量名的变量值提示信息 变量名 你在干什么? 玩原神 echo $ you 玩原神 #变量值
脚本示例:
脚本搭建yum仓库
#!/bin/bash mount /dev/sr0 /mnt cd /etc/yum.repos.d mkdir bak mv *.repo bak echo " [hyh] name=hyh baseurl=file:///mnt gpgcheck=0 " > hyh.repo yum clean all &>/dev/null #显示的内容放入垃圾箱 yum makecache &>/dev/null #显示的内容放入垃圾箱
建立一个简单的计算器脚本
注意一定要用英文符号
建立一个显示本机配置属性脚本
建立自动分区的脚本