基础shell的简介

shell脚本是Linux运维工程师必须掌握的技能之一,shell脚本的使用让我们更好的操作Linux系统,方便了我们的执行。

一,编程基础

编程基本概念

编程逻辑处理方式:顺序执行,循环执行,选择执行

程序:指令+ 数据

shell 编程:过程式、解释执行

shell程序:提供了编程能力,解释执行

程序编程风格:

过程式:以指令为中心,数据服务于指令

对象式:以数据为中心,指令服务于数据

程序的执行方式

计算机:运行二进制指令;

编程语言的基本结构:

数据存储:变量、数组

表达式: a + b

语句:if

编程语言:

低级:汇编

高级:

编译:高级语言--> 编译器--> 目标代码  : java,C#

解释:高级语言--> 解释器--> 机器代码  : shell, perl, python

编程程序语言分类

强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误

如 java,python

弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用

如:bash  不支持浮点数

二,shell 脚本基础

shell脚本规范和用途:

shell 脚本是包含一些命令或声明,并符合一定格式的文本文件

格式要求:首行shebang 机制

shell脚本:#!/bin/bash; 文件名以 .sh 结尾

Python: #!/usr/bin/python; 文件名以 .py 结尾

Perl   :#!/usr/bin/perl ; 文件名以 .pl 结尾

shell 脚本的用途有:

自动化常用命令

执行系统管理和故障排除

创建简单的应用程序

处理文本或文件

创建shell 脚本

第一步:使用文本编辑器来创建文本文件

第一行必须包括shell 声明序列:#!: #!/bin/bash

添加注释:注释以# 开头

第二步:运行脚本

给予执行权限,在命令行上指定脚本的绝对或相对路径

直接运行解释器,将脚本作为解释器程序的参数运行

脚本调试

bash -n /path/to/some_script

检测脚本中的语法错误

bash -x /path/to/some_script

调试执行

三,脚本变量的基础

变量(变量的内容是可以更改的,它可以存储很多类型的数据)

变量:命名的内存空间

数据存储方式:

字符:

数值:整型,浮点型

变量:变量类型

作用:1 、数据存储格式;2 、参与的运算;3 、表示的数据范围

类型:

字符

数值:整型、浮点型

变量命名法则:

1 、不能使程序中的保留字:例如if, for;

2 、只能使用数字、字母及下划线,且不能以数字开头

3 、见名知 义

4 、统一命名规则:驼峰命名法(多个单词命名,分为大,小驼峰,大驼峰是每个单词的第一个字母大写,小驼峰是除了第一个单词小写其他单词的第一个字母大写)

{

sleep 休眠:在脚本中执行 sleep + 时间 可以有时间查看父子进程,sleep默认时间为秒。

定义变量时不能带空格,必须用双引号扩起来才可以。

echo默认是一行,加双引号就可以原原本本显示出来。

}

四,变量的范围简介

根据变量的生效范围等标准:

本地变量:生效范围为当前shell 进程;对当前shell 之外的其它shell 进程,包括当前shell 的子shell 进程均无效

变量赋值:name=‘value’

可以使用引用value:

(1)  可以是直接字串; name=“root"

(2)  变量引用:name="$USER"

(3)  命令引用:name=` COMMAND `, name =$(COMMAND)

变量引用:${name}, $name

"" :弱引用,其中的变量引用会被替换为变量值

‘‘ :强引用,其中的变量引用不会被替换为变量值,而保持原字符串

显示已定义的所有变量:set

删除变量:unset name

环境变量:生效范围为当前shell 进程及其子进程局部变量:生效范围为当前shell 进程中某代码片断( 通常指函数)

变量声明、赋值:

export name=VALUE

declare -x name=VALUE

变量引用:$name, ${name}

显示所有环境变量:

export

env

printenv

删除:unset name

bash 有许多内建的环境变量:PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1

只读变量:只能声时,但不能修改和删除(一般使用在常量身上)

readonly name

declare -r name

(declare -rx name  定义一个即使常量,也是环境变量)

位置变量:$1, $2, ... 来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

在脚本代码中调用通过命令行传递给脚本的参数

$1, $2, ... :对应第1 、第2 等参数,shift [n] 换位置

$0:  命令本身

$*:  传递给脚本的所有参数,全部参数合为一个字符串

[email protected]:  传递给脚本的所有参数,每个参数为独立字符串

$#:  传递给脚本的参数的个数

[email protected] $*  只在被双引号包起来的时候才会有差异

示例:判断给出的文件的行数

linecount="$(wc -l $1| cut -d‘ ‘ -f1)"

echo "$1 has $linecount lines."

特殊变量:$?, $0, $*, [email protected], $#

basename  + 文件名

basename的语法是:basename[选项][参数]

选项:为有路径信息的文件名,如/home/test/test.txt

参数:指文件扩展名

五,bash运算

算术运算:help let(bash虽然不支持浮点,但是还是支持加减乘除的)

+, -, *, /, % 取模(取余), ** (乘方)

实现算术运算:

(1) let var= 算术表达式

(2) var=$[ 算术表达式]

(3) var=$(( 算术表达式))

(4) var=$(expr arg1 arg2 arg3 ...)

(5) declare –i var =  数值  (需要先申明数值,在进行计算)

(6) echo ‘ 算术表达式’ | bc

乘法符号有些场景中需要转义 ,如 如*

bash 有内建的随机数生成器:$RANDOM (1-32767)

echo $[$RANDOM%50]  :0-49

(echo $[RANDOM%50+1] :1-50    %50+1 :是0-49整体性的+1,不是单个的49+1)

$?是查看上一个命令的状态,

expr使用乘号需要把乘号转义和加空格  如:expr 2 \* 3

赋值

增强型赋值:+=, -=, *=, /=, %=

{

% : 在算术运算中,这个是求模操作符,即两个数进行除法运算后的余数;

}

let varOPERvalue

例如:let count+=3(自己先加3 后再给自己赋值)

自增,自减:

let var+=1

let var++

let var-=1

let var--

逻辑运算

true 1, false  0,

与:

1 与 1 = 1

1 与 0 = 0

0 与 1 = 0

0 与 0 = 0

或:

1 或 1 = 1

1 或 0 = 1

0 或 1 = 1

0 或 0 = 0

非:!

! 1 = 0

! 0 = 1

短路运算:

短路与:(&&)

第一个为0 ,结果必定为0;

第一个为1 ,第二个必须要参与运算;

cmd1 && cmd2

cmd1 成功,将执行cmd2

cmd1 失败,将不执行cmd2

短路或 :(||)

第一个为1 ,结果必定为1;

第一个为0 ,第二个必须要参与运算;

cmd1 成功,将不执行cmd2

cmd1 失败,将执行cmd2

异或:^

异或的两个值, 相同为假,不同为真

{

短路与  和   普通与 的区别

cmd1 &&  cmd2

短路与:  cmd1 为真时  ,执行 cmd2 ;  cmd1为假时  ,不执行 cmd2  直接退出。

普通与: cmd1 不管是真是假,cmd2 都要执行 。

短路或  和   普通或 的区别

cmd1 || cmd2

短路与 : cmd1 为真时,可以不用执行 cmd2 直接退出; cmd1 为假时,执行 cmd2 。

普通与 : cmd1 不管是真是假,cmd2 都要执行。

}

六,bash的退出状态

进程使用退出状态来报告成功或失败

0 代表成功,1 -255 代表失败

$?  变量保存最近的命令退出状态(最后一条的命令的状态)

例如:

$ ping -c1 -W1 hostdown &> /dev/null

$ echo $?

(ping  -c1  代表拼一个)(ping -W1    一秒,默认为是五秒,在局域网一般最多需要一秒连接的显示信息就能返回,在互联网时间稍长一点)

退出状态码

bash 自定义退出状态码

exit [n] :自定义退出状态码;(在脚本中(exit)执行的是子shell )

注意:脚本中一旦遇到exit 命令,脚本会立即终止;终止退出状态取决于exit 命令后面的数字

注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

七,bash 的测试类型

条件测试

判断某需求是否满足,需要由测试机制来实现;

专用的测试表达式需要由测试命令辅助完成测试过程;

评估布尔声明,以便用在条件性执行中

若真,则返回0

若假,则返回1

测试命令:

test EXPRESSION   (test $a = $b    测试$a 和$b 是否相同时 $a 和$b的前后必须要有空格,要是没有就成了赋值了)

[ EXPRESSION ]

[[ EXPRESSION ]]    ([[ $a ]] 测试$a 是否定义过值)

注意:EXPRESSION 前后必须有空白字符

test 命令

长格式的例子:

$ test "$A" == "$B" && echo "Strings are equal"

$ test “$A” -eq “$B” \

&& echo "Integers are equal"

简写格式的例子:

$ [ "$A" == "$B" ] && echo "Strings are equal"

$ [ "$A" -eq "$B" ] && echo "Integers are equal"

条件性的执行操作符

根据退出状态而定,命令可以有条件地运行

&&  代表条件性的AND THEN

|| 代表条件性的OR ELSE

例如:

$ grep -q no_such_user /etc/passwd \|| echo ‘No such user‘

No such user

$ ping -c1 -W2 station1 &> /dev/null \> && echo "station1 is up" \> || (echo ‘station1 is unreachable‘; exit 1)

station1 is up

数值测试:

-gt:  是否大于;

-ge:  是否大于等于;

-eq:  是否等于;

-ne:  是否不等于;

-lt:  是否小于;

-le:  是否小于等于;

字符串测试:

== :是否等于;

>: ascii 码是否大于ascii码

<:  是否小于

!=:  是否不等于

=~:  左侧字符串是否能够被右侧的PATTERN所匹配(右侧是要使用扩展正则表达式)

注意:用于字符串比较时的用到的操作数都应该使用引号

{

-z "STRING" :字符串是否为空,空为真,不空为假

-n "STRING" :字符串是否不空,不空为真,空为假

注意:  此表达式一般用于[[ ]] 中;

}

文件测试

存在性测试

-a FILE :同-e

-e FILE:  文件存在性测试,存在为真,否则为假;

存在性及类别测试

-b FILE :是否存在且为块设备文件;

-c FILE :是否存在且为字符设备文件;

-d FILE :是否存在且为目录文件;

-f FILE :是否存在且为普通文件;

-h FILE 或 或 -L FILE :存在且为符号链接文件;

-p FILE :是否存在且为命名管道文件;

-S FILE :是否存在且为套接字文件;

文件权限测试:(是以实际的权限为标准,不是看设的权限的。)

-r FILE :是否存在且可读

-w FILE:  是否存在且可写

-x FILE:  是否存在且可执行

文件特殊权限测试:

-g FILE :是否存在且拥有sgid 权限;

-u FILE :是否存在且拥有suid 权限;

-k FILE :是否存在且拥有sticky 权限;

文件大小测试:

-s FILE:  是否存 在 且非空;

文件是否打开:

-t fd: fd 表示文件描述符是否已经打开且与某终端相关

-N FILE :文件自上一次被读取之后是否被修改过

-O FILE :当前有效用户是否为文件属主

-G FILE:当前有效用户是否为文件属组

双目测试:

FILE1 -ef FILE2: FILE1 与FILE2 是否指向同一个设备上的相同inode

{

FILE1 -nt FILE2: FILE1 是否新于FILE2;

FILE1 -ot FILE2: FILE1 是否旧于FILE2;

}(比的是文件的修改时间)

组合测试条件

第一种方式:

COMMAND1 && COMMAND2  并且

COMMAND1 || COMMAND2  或者

! COMMAND 非

如:[ -e FILE ] && [ -r FILE ]

第二种方式:

EXPRESSION1 -a EXPRESSION2  并且

EXPRESSION1 -o EXPRESSION2  或者(or)

! EXPRESSION

必须使用测试命令进行;

# [ -z “$HOSTNAME” -o $HOSTNAME "==\"localhost.localdomain" ] && hostname www.magedu.com

# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

八,聚集命令

有两种聚集命令的方法:

复合式:date; who | wc -l (命令会一个接一个地运行)

子shell :(date; who | wc -l ) >>/tmp/trace  (所有的输出都被发送给单个STDOUT 和STDERR)

时间: 2024-10-10 04:05:45

基础shell的简介的相关文章

003、Linux基础和帮助简介

1.实现自动登录 为实现root用户直接登录系统,可进行如下配置: # gedit # nano /etc/gdm/custom.conf   [daemon]   AutomaticLoginEnable=true   AutomaticLogin=root 常用的与登录提示信息相关的配置文件: # vim /etc/issue   //修改登录前显示信息 # vim /etc/motd     //修改登录后提示信息 2.终端terminal 设备终端(键盘鼠标显示器) 物理终端(控制台co

《学习bash》笔记--基础shell编程

1.shell脚本和函数 脚本是包含shell命令的文件,它是一个shell程序,有三种方式运行它们: 一是键入source scriptname,使得脚本的命令被读取并运行,就好像键入它们一样. 二是运行bash scriptname,打开一个子shell来读取并执行脚本文件中命令.该脚本文件可以无"执行权限". 三是使用./scriptname,打开一个子shell读取并执行脚本文件中的命令,该脚本需要"执行权限". 1.1.函数 函数是一种脚本内脚本,你使用它

图像处理之基础---卷积模板简介

1.使用模板处理图像相关概念:       模板:矩阵方块,其数学含义是一种卷积运算. 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别与卷积核(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值. 卷积核:卷积时使用到的权,用一个矩阵表示,该矩阵与使用的图像区域大小相同,其行.列都是奇数,是一个权矩阵. 卷积示例: 假设3 * 3的像素区域R与卷积核G分别为: 则卷积运算为: R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 +

Linux Shell——bash shell 脚本简介

bash shell 脚本简介 shell 运行环境 如果你运行的是 Unix 或 Linux 系统,例如 Ubuntu,Red Hat,SUSE Linux,还有macOS,都是内置了 bash shell 的,所以你不需要额外配置所谓的开发环境. 我的 shell 环境是 macOS Sierra 版本,如果你用的是其他 Linux 系统,后面的例子基本上都是可以运行的. 首先,打开Terminal 命令行,先检查下你的系统的 shell 版本: echo $BASH_VERSION bas

OC基础-面向对象编程简介

OC语言特点: C语言的超集,可与C,C+混编,具有良好的兼容性. 具备完善的面向对象特征. 包含一个运行时系统. 类库丰富. 面向对象编程(OOP:Object Oriented Programming)简介: 常用语言:java,C#,C++ 特征:对象,类,封装,继承,多态 面向过程与面向对象区别: 前者以过程为中心实现函数,依次调用,以过程为中心. 分解问题组成的对象,协调对象间相互通信.以对象为中心. OC中类的定义: 使用对象完成程序. 先定义类,在创建对象,然后使用对象. 接口部分

FeWeb基础之JavaScript简介

FeWeb基础之JavaScript简介 1.JavaScript的基本介绍 JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,它是通过嵌入或调入在标准的HTML语言中实现的.JavaScript的出现使得前端页面中信息和用户之间不只是已汇总显示和浏览的关系,而是实现了一种实时的.动态的.可交互的表达能力. 相对于Java,JavaScript要简单的多.Javascript也是一种平台无关性的语言,它依赖于浏览器本身,与操作环境无关,只要计算机能够运行浏览器,并支持Java

Hbase 基础 - shell 与 客户端

以下内容为个人理解,仅供参考. 一.简介 Hbase是在HDFS上开发的面向列的分布式数据库,适用于随机读/写超大规模的数据集(通常这种数据压力传统RDBMS很难承受),可以在廉价的硬件上构成的集群上管理超大规模的稀疏表,并且可以水平扩展. 二.基础概念 1.Hbase把数据存放在表中,表由行列组成,表中的行是排序的(根据ASCII顺序),行键作为表的主键,对表的数据访问需要通过主键或者主键Range,故行键的设计很重要. 2.列由“列族”组成(即对列分类),不同列族的数据通常放在不同的文件夹里

Python学习第二天----网络基础及操作系统简介(安装linux系统)

一.操作系统 1.操作系统是一个协调.管理和控制计算机硬件资源和软件资源的控制程序,位于计算机软件与硬件之间,其实也是一款软件. 2.操作系统的组成:内核(运行于内核态为了管理硬件资源) 系统调用接口(运行于用户态为应用程序提供系统调用接口) 3.操作系统的功能:跟硬件衔接的部分隐藏了丑陋的硬件调用接口,为应用程序员提供了更好.更简单.更清晰的系统调用接口:跟应用程序衔接的部分封装了美丽的接口,将应用程序对硬件资源的竞态请求变得有序化 4.操作系统与普通软件的区别 操作系统由硬件保护,不能被用户

最最最最最最最最基础的C---C简介和基础算法

C简介 C是一门程序设计语言,面向过程的语言.于1972至1973年设计出来的语言. C具有32个关键字,9种控制语句,34种运算符. 函数是C的基本单位:一个C程序的执行总是从main函数开始的. C程序运行步骤:源程序--编译-->目标文件--执行-->可执行目标程序. 基础算法 完整的程序设计=数据结构+算法+程序设计方法+语言工具 算法特效: 1.有穷性:一个算法包含有限的操作步骤 2.确定性:确定算法的每一个步骤都是确定的 3.有零个或多个输入 4.有一个或多个输出 5.有效性:算法