目录
什么是shell脚本
面向过程语言
面向对象 windows
三种处理逻辑
常用的:usr/bin/bash
基本申明
三个基本语法
执行脚本
脚本错误
三种错误区别
set -e
set -u
重定向
管道符
变量
常见的shell变量的类型包括
整数的运算
整数运算
$RANDOM 随机数 %取余(膜)
环境变量
只读变量
位置变量
预定(状态)变量
$*:表示所有位置参数的内容看成一个整体返回 返回所有
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#:表示命令行中位置参数的总个数
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
$$:当前bash的进程id
$!: 后台任务最后一个id
Shell脚本是一种利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。Shell脚本类似于早期DOS时代的批处理文件(.bat),最简单的功能就是将许多命令集合写在一起,让用户很轻易地就能够用one touch的方法去处理复杂的操作(执行一个文件“shell脚本”,就能够依次执行多个命令)。
需要一步一步执行,以指令为中心,数据服务于指令
开发的时候将任务当成一个整体
shell是命令解释器 bash
shell 将人类高级语言翻译成二进制,也可以二进制翻译成高级语言
人类的命令集合,然后用bash(shell)去翻译,给硬件执行
顺序执行:程序按从上到下顺序执行
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)
#!/bin/bash 申明
# 申明解释器 代表我接下来,使用什么解释器
# 注释意思
1.申明解释器
2.注释信息
3.执行命令
1.直接使用shell解释器加上脚本名(bash 脚本名 不需要加权)
[root@localhost ~]# bash 12
请输入第一个数:4
请输入第二个数:3
7
2.路径/脚本 (绝对路径 )脚本名后面加 .sh shell语法高亮 (需要权限 +x执行权限)
[root@localhost ~]# ./12
-bash: ./12: 权限不够
3.source(.)加脚本名字 (不需要权限) (不推荐 sourece会直接修改当前bash的shell环境)
[root@localhost ~]# . 12
请输入第一个数:2
请输入第二个数:3
5
4.如果你想让脚本全局运行,将脚本放入$PATH路径下并且脚本有执行权限
[root@localhost ~]# $PATH
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录
1.命令错误 不会影响接下来的命令,但会影响本条命令
2.语法错误 直接影响脚本无法正常运行
3.逻辑错误 在Shell脚本中,逻辑错误可能会导致脚本无法正确地执行预期的操作,甚至可能产生错误的结果
1.语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
2.命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
3.逻辑错误:只能使用 bash -x 进行
在脚本的前面输入 set -e 一旦出错立刻停止
[root@localhost ~]# vim 1
[root@localhost ~]# bash 1
1: 第 4 行:cd: /et: 没有那个文件或目录
[root@localhost ~]#
变量不存在不让执行
[root@localhost ~]# vim q
[root@localhost ~]# bash q
q:行5: ba: 为绑定变量
[root@localhost ~]#
重定向:改变电脑数据输出的方向
默认:电脑数据的输出方向是屏幕
标准输出:你发了一条指令给电脑操作,电脑回复你,结果一定是显示在屏幕上,我们称为标准输出(标准输入通过键盘,鼠标,扫描仪,话题给电脑称为标准输入)
错误输出:如果电脑没有正确的回复你称为错误输出
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
(将第一个命令结果,当做后一个命令的处理对象)
在Linux中,变量是一种可改变的量,通常由字母和数字组成,且开头不能为数字
1.整数 变量名=变量值 (两边无空格)
2.字符 调用变量 echo $变量名
删除变量 unset 变量名
重新定义变量 变量名=变量值
追加变量 变量名+ =变量值
自定义变量:由用户自己定义,修改和使用
预定义变量:Bash中内置的一类变量 shell 不能修改 规定好的变量 放在那里让你使用
环境变量:由系统维护,用于设置工作环境 当前目录 当前主机名啊 $PATH
只读变量:只可以读取不可以更改 只能不能修改 常量
位置变量:通过命令行给脚本传递参数
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
[root@localhost opt]# vim qqq.sh
read -p "请输入第一个数:" q
read -p "请输入第二个数:" w
read -p "请输入第三个数:" e
expr $q \* $w + $e
[root@localhost opt]# bash qqq.sh
请输入第一个数:3
请输入第二个数:2
请输入第三个数:1 // 3*2+1
7
由系统提前创建,用来设置用户的工作环境
可以使用env查看环境变量
需要记住的常用环境变量
env 可以看到所有
[root@localhost opt]# env
XDG_SESSION_ID=150
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.17.29 51174 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/2
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/opt
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
SSH_CONNECTION=192.168.17.29 51174 192.168.17.55 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
DISPLAY=localhost:11.0
_=/usr/bin/env
OLDPWD=/root
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
环境变量:
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
readonly name 是一个只读属性,表示该属性只能在声明时或构造函数中被初始化,并且之后不能被修改
[root@localhost ~]# name=ky33
[root@localhost ~]# readonly name //readonly name是一个只读属性,表示该属性只能在声明时或构造函数中被初始化,并且之后不能被修改
[root@localhost ~]# echo $name
ky33
[root@localhost ~]# unset name
-bash: unset: name: 无法反设定: 只读 variable
[root@localhost ~]# echo $name
ky33
[root@localhost ~]# name=www
-bash: name: 只读变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
[root@localhost~]# vim 1.sh
#!/bin/bash
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 将所有项当成一个值
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数
[root@localhost~]# ./1.sh {1..10}
1
2
10
10
1 2 3 4 5 6 7 8 9 10
bash 帮你定义好了 拿来用就可以了