shell基础

什么是shell

shell是一个命令解释器,提供用户和机器之间的交互
支持特定语法,比如逻辑判断,循环
还有zsh,ksh等
centos7默认的shell为bash(Bourne Agin Shell)
shell是一个用c语言编写的程序语言,它是用户使用linux的桥梁,shell既是一种命令语言,又是一种程序设计语言
shell是一种解释型语言,这种语言经过编写后不经过任何编译就可以执行,是一种脚本语言。和编译型语言是执行前翻译不同,解释型语言的程序是执行时翻译,所以效率差一些

编译型语言和解释型语言
编译型语言
  • 优点
    编译器一般会有预编译的过程对代码进行优化,因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行
  • 缺点
    编译之后如果需要修改就需要整个模块重新编译。编译时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件

代表语言:C,C艹,Pascal,Object-C,swift等

解释型语言
  • 优点
    有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护
  • 缺点
    每次运行都要解释一遍,性能上不如编译型语言

代表语言:javaScript,Python,Erlang,PHP,Perl,Ruby

编写第一个shell脚本:
在这里插入图片描述
运行脚本有两种方法
1)使用bash执行
在这里插入图片描述
在这里插入图片描述
2)给脚本添加可执行权限,然后直接执行
在这里插入图片描述
脚本是各种命令的集合,终究还是要执行服务的
查看命令存储路径
在这里插入图片描述

变量

顾名思义,变量就是其值可以变化的量。从变量本质来说,变量名是指向一片用于存储数据的内存空间。变量有局部变量和环境变量之分。在脚本中往往需要使用变量来存储有用的信息,比如文件名,路径,数值等,通过这些变量可以控制脚本的运行行为

局部变量

是指在某个shell中生效的变量,对其他shell来说这个变量无效,局部变量的作用空间被限制在声明它们的shell里,可以用local内建命令来"显式"的声明局部变量,但仅限于函数内使用

环境变量(全局变量)

在shell脚本里变量默认就是全局的,为了让子shell继承当前shell的变量,可以使用export命令将其定义为环境变量
定义变量:变量名=变量值

设置环境变量的方法

第一种
第一种
第二种
第二种
变量命名
shell中的变量必须以字母或者下划线开头,后面可以跟数字,字母和下划线,长度没有限制,区分大小写

特殊变量

上边我们说明了局部变量和环境(全局变量)也知道了它们的特点,除了这些还有一些其他的变量,也需要我们注意

只读变量(常量)

只能声明,但不能修改和删除

还可以使用declare -r声明常量
在这里插入图片描述

括号的使用

小括号用法:一次性使用,不会对环境产生影响
在这里插入图片描述
大括号用法:前后有空格,这个对全局都有影响
在这里插入图片描述

位置变量

shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定
$0:代表脚本本身名字
$1------$9:第一个位置参数-------第九个位置参数
$#:脚本参数个数总和
$@:表示脚本的所有参数
$*:表示脚本的所有参数

在这里插入图片描述

在这里插入图片描述
那么这个有什么用呢?举个例子:
假如我们要复制一个文件到另一台机器
就可以用脚本来写啦


$* 和 $@ 的区别

$ *和$ @都代表了脚本的所有参数,但是,$ *会把显示的结果当做一个整体显示,而$ @会把收集到的结果分开显示。不过要注意,如果$ *和$ @有双引号的前提下,显示效果会做区分,如果都没有双引号,效果一样

$0引用名称的使用

$0是脚本名称,那么如果给一个脚本添加一个软连接,这个时候如果再运行脚本,那么它$0显示的名字应该是原来的名字还是更改过后的名字呢
在这里插入图片描述
我们以后就可以利用这一点,即便是同一个脚本,到时候也可以扩展出不同的功能,不过也要注意对$0做判断了

shift命令:整体往左位移

默认移动一位,可以通过设置决定移动多少位,在shift后边加上想要移动的位数即可

退出状态

进程使用退出状态来报告成功或者失败
$?变量保存最近命令的退出状态,0代表成功 1-255代表失败
如下:

在这里插入图片描述
我们可以使用$?判断上一条命令是否执行成功,但在脚本里的命令往往是多于一条的
只有一条命令的脚本👇

在这里插入图片描述
如果是有多条命令而且中间还出错了的脚本呢?👇
在这里插入图片描述
//发现$?通常情况下之会返回最后一条命令的状态。
但这也不是绝对的,比如语法错误👇
在这里插入图片描述

退出状态码$?也是可以被修改的
在这里插入图片描述
在这里插入图片描述


数组

数组是以一种特殊的数据结构,其中每一项被称之为一个元素,对每个元素,都可以用索引的方式取出元素的值。使用数组的典型场景是一次性要记录很多类型相同的数据时(但不一定要必须相同)。比如,为了记录班级中所有人的数学成绩,如果不用数据来处理,那就只能定义所有人成绩的变量。shell中的数组对元素个数没有限制,但只支持一维数组。

1.定义数组

//使用declare命令定义数组
在这里插入图片描述
//在创建数组的同时赋值,declare -a也可以省略不写
在这里插入图片描述
//也可以用复数,表示倒叙
在这里插入图片描述
//还可以指定索引号
在这里插入图片描述
注意:多个元素之间不需要用符号分隔,否则会把多个元素当做整体一起输出👇
在这里插入图片描述

2.数组的取值

数组取值格式:${数组名[索引]}

默认显示数字第一个元素值
在这里插入图片描述
取出对应索引下标的值
在这里插入图片描述
ps:数组内索引为0的才是第一个

3.一次取出数组所有的值

[@]:得到的是以空格隔开的元素
在这里插入图片描述
[*] //得到的是一整个字符串

在这里插入图片描述

4.数组长度(数组元素个数)

利用“@”或“*”字符,可以将组扩展成列表,然后使用“#”来获取数组元素的个数
在这里插入图片描述

5.数组的截取(分片,切片)

可以截取某个元素的一部分,对象可以是整个数组或某个元素
//定义组
在这里插入图片描述
//取出第一个到第三个元素的值
在这里插入图片描述
//取出第三个到第六个元素的值
在这里插入图片描述
注意:数组分片的书写格式的意义表示:从第几个开始连续出现几个字符
//也可以取出某个元素的第几个开始到第n个字符
在这里插入图片描述

6.连接数组

将若干个数组进行拼接操作
在这里插入图片描述
//将两个数组的元素全部连接
在这里插入图片描述
//重组新的数组,截取word数组的第二个元素从第0个连续5个字符,和number数组里的第2个字符开始连续3个字符
在这里插入图片描述

7.替换元素

将数组内某个元素的值替换成其他值,如果匹配不到则没有改动
在这里插入图片描述
//上边的写法可以达到目的,但较为复杂,其实可以按照变量重新赋值的方式,直接写数组的对应的元素的值。比如,上述例子中将zhangsan改为wangwu就可以简化为如下
在这里插入图片描述
//取消数组或元素
使用unset命令,取消数组中的一个元素
在这里插入图片描述
//取消整个数组,取消变量全部
在这里插入图片描述


转义和引用

shell中很多特殊字符,会有特殊意义,但是有时候会造成麻烦,需要转义才可以使用,转义符号为“\”
在这里插入图片描述
引用是指将字符串用某种符号括起来,以防止特殊字符被解析为其他意思。shell中一共有4中引用符,分别为双引号,单引号,反引号和转义符。双引号可以引用除$符号,反引号,转义符之外的所有字符;单引号可以引用所有字符;反引号将会将反引号中的内容解释为系统命令
在这里插入图片描述
在这里插入图片描述


运算符

shell中的运算符主要有比较运算符(用于整数比较),字符串运算符(用于字符串测试),文件操作运算符(用于文件测试),逻辑运算符,算术运算符,位数运算符,自增自减运算符等

1.算术运算符

算术运算符指的是加,减,乘,数,余,幂等常见的算术运算,以及加等,减等,乘等,除等,余等复合算术运算。注意:shell只支持整数计算,也就是说所有可能产生小数的运算都会舍去小数部分
在这里插入图片描述
bash shell的算术运算方式有四种
1)使用expr外部程式
在这里插入图片描述
注意:4 + 5这三者之间要有空白否则将会出现如下错误
在这里插入图片描述
2)使用$(())

在这里插入图片描述
3)使用$[]
在这里插入图片描述
4)使用let命令
在这里插入图片描述
5)总结
4种写法的算术运算,例子以数字2,3举例
在这里插入图片描述
ps:let命令可以直接使用变量名,并且支持变量名和具体数值之间的各种运算

2.与运算,或运算,异或运算

在说这个之前,先来说一下10进制转2进制
将一个十进制数除以二,得到的商再除以二,以此类推直到商等于一或零时为止,倒取除得的余数,即换算为二进制数的结果
在这里插入图片描述
二进制转换十进制的原理:从二进制右边第一个数开始,每一个乘以2的n次方,n从0开始,每次递增1,然后得出来的每个数相加即是十进制数
在这里插入图片描述
与运算:&(并且)and

  • 0 false 假
  • 1 true 真
  • 0&0=0
  • 0&1=0
  • 1&0=0
  • 1&1=1

或运算:| 或者 or

  • 0 | 0=0
  • 0 | 1=1
  • 1 | 0=1
  • 1 | 1=1

XOR运算:^异或

  • 0^1=1
  • 0^0=0
  • 1^0=1
  • 1^1=0

短路与&&逻辑与

  • 0&&0=0
  • 0&&1=0
  • 1&&0=0
  • 1&&1=1
    如果是命令:
    cmd1 && cmd2
    如果cmd1为假,cmd2不需要执行,反之cmd1为真,则需要执行cmd2。也就是说前面命令执行成功,后面的才会执行

短路或 || 逻辑或

  • 0 || 0=0
  • 0 || 1=1
  • 1 || 0=1
  • 1 || 1=1
    cmd1 || cmd2
    如果cmd1为真,cmd2不需要执行。反之cmd1为假,则需要执行cmd2
3.关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值上数字

  • -eq 检测两个数是否相等,相等返回true [ $a -eq $b ]
  • -ne 检测两个数是否不相等,不相等返回true [ $a -ne $b ]
  • -gt 检测左边的数是否大于右边的,如果是则返回true [ $a -gt $b ]
  • -lt 检测左边的数是否小于右边的,如果是则返回true [ $a -lt $b ]
  • -ge 检测左边的数是否大于等于右边的,如果是则返回true [ $a -ge $b ]
  • -le 检测左边数是否小于等于右边的,如果是则返回true [ $a -le $b ]

eq:equql 平等的,相等的
gt:greater 较大的,大于
lt:less then 小于


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3369_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值