初识shell脚本

目录

什么是shell脚本

面向过程语言

面向对象   windows

三种处理逻辑

常用的:usr/bin/bash

基本申明

三个基本语法

执行脚本

脚本错误

三种错误区别

set -e

set -u 

重定向

管道符

变量

常见的shell变量的类型包括

整数的运算

整数运算

 $RANDOM 随机数  %取余(膜)

环境变量

只读变量

位置变量

预定(状态)变量

$*:表示所有位置参数的内容看成一个整体返回 返回所有

$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有

$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

$#:表示命令行中位置参数的总个数

$0:表示当前执行的脚本或程序的名称 当前脚本的名字

$$:当前bash的进程id

$!: 后台任务最后一个id


什么是shell脚本

Shell脚本是一种利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。Shell脚本类似于早期DOS时代的批处理文件(.bat),最简单的功能就是将许多命令集合写在一起,让用户很轻易地就能够用one touch的方法去处理复杂的操作(执行一个文件“shell脚本”,就能够依次执行多个命令)。

面向过程语言

需要一步一步执行,以指令为中心,数据服务于指令

面向对象   windows

开发的时候将任务当成一个整体

shell是命令解释器  bash

shell 将人类高级语言翻译成二进制,也可以二进制翻译成高级语言

人类的命令集合,然后用bash(shell)去翻译,给硬件执行

三种处理逻辑

顺序执行:程序按从上到下顺序执行

选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)

常用的:usr/bin/bash

基本申明

#!/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

 在脚本的前面输入 set -e  一旦出错立刻停止

[root@localhost ~]# vim 1
[root@localhost ~]# bash 1
1: 第 4 行:cd: /et: 没有那个文件或目录
[root@localhost ~]# 

初识shell脚本_第1张图片

set -u 

变量不存在不让执行

[root@localhost ~]# vim q
[root@localhost ~]# bash q
q:行5: ba: 为绑定变量
[root@localhost ~]# 

初识shell脚本_第2张图片

重定向

重定向:改变电脑数据输出的方向

默认:电脑数据的输出方向是屏幕

标准输出:你发了一条指令给电脑操作,电脑回复你,结果一定是显示在屏幕上,我们称为标准输出(标准输入通过键盘,鼠标,扫描仪,话题给电脑称为标准输入)

错误输出:如果电脑没有正确的回复你称为错误输出

初识shell脚本_第3张图片

初识shell脚本_第4张图片

管道符

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

   (将第一个命令结果,当做后一个命令的处理对象)

变量

在Linux中,变量是一种可改变的量,通常由字母和数字组成,且开头不能为数字

1.整数   变量名=变量值   (两边无空格)

2.字符   调用变量  echo  $变量名

             删除变量  unset  变量名

             重新定义变量  变量名=变量值

             追加变量    变量名+ =变量值

常见的shell变量的类型包括

自定义变量:由用户自己定义,修改和使用

预定义变量: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

初识shell脚本_第5张图片

 $RANDOM 随机数  %取余(膜)

初识shell脚本_第6张图片

环境变量

由系统提前创建,用来设置用户的工作环境

可以使用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 帮你定义好了 拿来用就可以了

$*:表示所有位置参数的内容看成一个整体返回 返回所有

$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有

$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

$#:表示命令行中位置参数的总个数

$0:表示当前执行的脚本或程序的名称 当前脚本的名字

$$:当前bash的进程id

$!: 后台任务最后一个id

你可能感兴趣的:(linux,运维)