当前位置: 首页 > news >正文

shell介绍

shell介绍

一、脚本基础
1、shell编程介绍与特性
Shell是种命令解释程序,也可以看作是一种命令语言的解释器。用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,
才能够被Shell理解并执行。Shell所使用的这种命令语言称为Shell语言。Shell语言不仅仅是一种交互式语言,它还是一种可编程的程序设计语言。
将若干个Shell命令行写入个文件就构成了一个Shell程序,它可以被Shell逐条地解释执行。用Shell语言编写的Shell程序可以使用各种变量、
参数和控制结构来组织命令流程,自动化地完成各种复杂冗繁的处理工作。

Linux系统中广泛使用了Shell程序来实现系统的初启、配置、管理和维护等工作。因此,熟练掌握Shell语言可以更加深入地理解系统的运行机制,
更加有效地使用和管理系统。

Shell语言的特点:
与其他编程语言相比,Shell语言具有如下特点:

(1)Shell是一种解释性语言。这就是说,用Shell语言写的程序不需编译,可以直接由Shell进程解释执行。解释性语言的特点是快捷方便,
可以即编即用,但与编译性语言的目标程序来比,解释性语言程序的运行速度要低一些。

(2)Shell是基于字符串的语言。Shell只是做字符串处理,不支持复杂的数据结构和运算。Shell的输出也全部是字符方式的。

(3)Shell是命令级语言。Shell程序全部由命令而不是语句组成,几乎所有的Shell命令和可执行程序都可用来编写Shell程序。
Shell命令十分丰富,命令的组合功能也十分强大。所以,用简单的命令和命令组合形成的Shell程序即简洁又高效,可以实现各种复杂的功能。
另外需要说明的是,不同版本的Shell程序不完全兼容,差别可能是细微的,也可能是明显的。

Shell程序也称Shell脚本,是由一系列Shell命令为基本元素构成的文本文件。简单的Shell程序可以只是一个命令序列,
高级Shell程序中还可以包含复杂的命令组合,定义各种参数和变量、使用条件命令、控制结构以及其他高级特性。

2、变量
(1)什么是变量?
顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量几乎所有的程序设计语言中都有定义,
并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。
在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。

(2)变量得命名
在shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,shell并没有做出明确的规定。
因此,用户可以使用任意长度的字符串来作为变量名。但是,为了提高程序的可读性,建议用户使用相对较短的字符串作为变量名。

在一个设计良好的程序中,变量的命名有着非常大的学问。通常情况下,用户应该尽可能选择有明确意义的英文单词作为变量名,
尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用。

(3)变量的类型

​ 整形 int age=10
​ 浮点型 float salary=3.1

字符型:在shell中,加了引号的字符就是字符串类型 单引号 双引号 也可以不用引号
msg=“hello ws”
注意:字符串包含空格必须加引号

msg=ws
echo $msg
连续字符不加引号包含也是可以的,但是我们还是强烈建议加上引号,规范一些。

单引号和双引号的意义是不同的
双引号 “ ” 弱引用 引号的特殊字符有意义
单引号 ‘ ’ 强引用 引号内所有特殊字符都取消意义

#!/bin/bash
name="ws"
echo "${name} is good"
echo '${name} is good'
[root@ws ~]# bash b.sh 
ws is good
${name} is good

boolean布尔型:
它只能是True或False 就是真假是非

3、脚本执行方式
(1)使用绝对路径执行
(2)使用相对路径执行。语法格式:./a.sh
(3)使用sh或bash命令来执行。
语法格式:
sh a.sh 不需要执行权限
(4)使用.(空格)脚本名称来执行
语法格式:
. a.sh 不需要执行权限,注意的是.后面有空格
(5)使用source来执行
语法格式:
source a.sh 不需要执行权限(主要用于生效配置文件)

4、shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

二、脚本的组成结构

1、脚本的组成
(1)开头:#!/bin/bash 其中符号#!是用来告诉系统我们是用什么解析器来执行的
(2)注释:以#开头行表示注释
(3)命令行的书写规则:一行为一条命令,一行多条命令时需用(;)分割,分割长命令可以使用反斜杠\

#!/bin/bash
echo “Hello World!”

2、程序返回值
程序执行以后有两类返回值:
(1)程序执行的结果
(2)程序状态返回代码(0-255)
0:正确执行
1-255:错误执行

三、shell脚本调试
1、脚本执行的过程解析
当Shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile、
当前用户家目录下的.bash_profile、当前用户家目录下的.bashrc、/etc/bashrc等),在加载了上述环境变量文件后,Shell就开始执行Shell脚本中的内容。

Shell脚本是从上至下、从左至右依次执行每一行的命令及语句的,即执行完了一个命令后再执行下一个,
如果在Shell脚本中遇到子脚本(即脚本嵌套)时,就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句。

2、脚本执行的原理
shell在解释命令的时候并不是自己亲自执行,而是派生子进程让子进程去完成这项工作,这样的好处是把风险交给别人,
当指令的执行出现问题时不会影响到shell(影响到其他指令的执行)。shell不可以挂,
shell 一旦挂就没有什么可以解释命令了。对我们而言shell为了保证自己风险最低,
通过创建子进程进行命令行的解释工作。而shell自己只要去等就可以了。

3、写脚本注意事项
(1)开头加解释器:#!/bin/bash
(2)语法缩进,使用四个空格;多加注释说明
(3)命名建议规则:变量名大写,局部变量小写,函数名小写,名字体现出实际作用
(4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域
(5)有两个命令能帮助调试脚本:set -e 遇到执行非0时退出脚本 set -x打印执行过程
(6)写脚本一定要先测试再到生产上
(7)脚本中的命令一定要用绝对路径
(8)引用命令是需要用 符号

4、脚本调试方法
bash -n 脚本名 检查脚本是否有语法错误
bash -x 脚本名 单步执行,检查脚本错在哪里

[[:alpha:]] 代表任意大小写字母
[[:digit:]] 代表任意整数
案例:
(1)创建目录/tmp/ssz
(2)切换到/tmp/ssz目录
(3)创建目录a1s b2s 6ssz
(4)创建空文件 xs h123y 523
(5)列出当前目录下以a或者6开头的文件或目录,将这些文件或目录导入到/tmp/file3文件中
(6)列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到/tmp/file4文件中

#!/bin/bash
echo "创建目录"
mkdir /tmp/ssz
echo "创建目录完成"
echo "切换目录到/tmp/ssz"
cd /tmp/ssz
echo "切换完成"
echo "创建目录" 
mkdir a1s b2s 6ssz
echo "创建完成"
echo "创建文件"
touch xs h123y 523
echo "创建完成"
echo "正在列出以a或6数开头的文件或目录导入到/tmp/file3"
ls | grep "^[a|6]" > /tmp/file3
echo "导入完成"
echo "正在列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到/tmp/file4文件中"
ls | grep "^[[:alpha:]][[:digit:]]" > /tmp/file4
echo "导入完成"
echo $?
[root@ws ~]# . c.sh 
创建目录
创建目录完成
切换目录到/tmp/ssz
切换完成
创建目录
创建完成
创建文件
创建完成
正在列出以a或6数开头的文件或目录导入到/tmp/file3
导入完成
正在列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到/tmp/file4文件中
导入完成
0
[root@ws ~]# cd /tmp/ssz/
[root@ws ssz]# ls
523  6ssz  a1s  b2s  h123y  xs
[root@ws tmp]# cat file3
6ssz
a1s
[root@ws tmp]# cat file4
a1s
b2s
h123y

四、运算符
原生的bash并不支持简单的数学运算,通常要通过其他命令来实现
1、算术运算符
a和b都是变量
加法 expr $a + $b
减法 expr $a - $b
乘法 expr $a * $b
除法 expr $b / $a
取余 expr $b % a赋值a=a 赋值 a=a赋值a=b
相等 [ $a == $b ]
不相等 [ $a != $b ]

#!/bin/bash
a=10
b=20
c=`expr $a + $b`
echo "a+b: $c"
c=`expr $b - $a`
echo "b-a: $c"
c=`expr $a \* $b`
echo "a*b: $c"
c=`expr $b / $a`
echo "b/a: $c"
[root@ws ~]# . e.sh 
a+b: 30
b-a: 10
a*b: 200
b/a: 2

A=3
B=6
let C=A+A+A+B //let算术运算表达式
C=$[ A+A+A+B ] //[算术运算表达式]C=[算术运算表达式] C=[算术运算表达式]C=(( A+A+A+B )) //$((算术运算表达式))
C=expr $A + $B //expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用

例题:
写一个脚本,传递两个整数给此脚本,让脚本分别计算并显示这两个整数之和,差,积,商

#!/bin/bash 
let c=$1+$2
echo "$1+$2: $c"
c=$[ $1-$2 ]
echo "$1-$2: $c"
c=$(( $1*$2 ))
echo "$1*$2: $c"
c=`expr $1 / $2`
echo "$1 / $2: $c"
[root@ws ~]# . e.sh 20 10
20+10: 30
20-10: 10
20*10: 200
20 / 10: 2

2、逻辑运算
逻辑与:&& 相当于是AND的关系
第一个条件为假是,第二个条件不用再判断,最终结果已经有了,就是false
第一个条件为真时,第二个条件必须得判断

逻辑或:|| 相当于是OR的关系
前一个命令的结果为真时,第二个命令就不执行
前一个命令的结果为假时,第二个命令必须执行


文章转载自:

http://DWEIgTLK.mywnk.cn
http://x1kMO3Nz.mywnk.cn
http://oxN5XxOs.mywnk.cn
http://K0DTHmHJ.mywnk.cn
http://ezoTM5Y9.mywnk.cn
http://HRA44aHC.mywnk.cn
http://Whm6wUuP.mywnk.cn
http://MNmx9eND.mywnk.cn
http://PmHpeG6w.mywnk.cn
http://Hu6m1zT1.mywnk.cn
http://4hAFgRhF.mywnk.cn
http://RlBXThRZ.mywnk.cn
http://nP6N1Of0.mywnk.cn
http://QX2Fkt3X.mywnk.cn
http://tVkxaF8D.mywnk.cn
http://aXoe4AV4.mywnk.cn
http://n0SNeBgK.mywnk.cn
http://vi0i7tkt.mywnk.cn
http://QjyV6ltZ.mywnk.cn
http://X6f2YWn4.mywnk.cn
http://NJI9m0EJ.mywnk.cn
http://VgeMNsc3.mywnk.cn
http://bY10xVSh.mywnk.cn
http://yKdCL0df.mywnk.cn
http://kfCPo3Q9.mywnk.cn
http://oTjNax9k.mywnk.cn
http://kHXJIAG5.mywnk.cn
http://ASDcFhex.mywnk.cn
http://LHQhGEmo.mywnk.cn
http://f6i8hSGD.mywnk.cn
http://www.dtcms.com/a/375364.html

相关文章:

  • vla 开源最强的模型是哪一个
  • FreeRTOS任务切换详解
  • 面试不会问题
  • 享元模式,用Qt/C++绘制森林
  • GO RPC 教学文档
  • Atlantis Word Processor:全方位的文字处理专家
  • [iOS] 单例模式的深究
  • 视频通话实现语音转文字
  • String-HashCode源码分析
  • 深入浅出C++继承机制:从入门到实战
  • 级联框的实现
  • android 性能优化—内存泄漏,内存溢出OOM
  • 从PyTorch到ONNX:模型部署性能提升
  • JAVA:实现快速排序算法的技术指南
  • SQL 触发器从入门到进阶:原理、时机、实战与避坑指南
  • 无标记点动捕技术:重塑展厅展馆的沉浸式数字交互新时代
  • 【Agent】DeerFlow Planner:执行流程与架构设计(基于真实 Trace 深度解析)
  • R语言读取excel文件数据-解决na问题
  • 在钉钉上长出的AI组织:森马的路径与启示
  • IntelliJ IDEA 中 JVM 配置参考
  • JVM(二)--- 类加载子系统
  • 9.ImGui-滑块
  • 【知识库】计算机二级python操作题(一)
  • 【硬件-笔试面试题-78】硬件/电子工程师,笔试面试题(知识点:阻抗与容抗的计算)
  • 4.5Vue的列表渲染
  • 使用YOLO11进行路面裂缝检测
  • 常见并行概念解析
  • 9月9日
  • centos系统上部署安装minio
  • 下载CentOS 7——从阿里云上下载不同版本的 CentOS 7