shell编程

2023-09-14 19:47:08

shell脚本的第一行

一般shell脚本的第一行用于在没有指定解释器时,默认使用这个解释器执行
如,默认使用Bash解释器来执行这个脚本

#!/bin/bash

如果安装了python3,想写一个py文件并执行:
在这里插入图片描述
这里的第一行就写python3命令的所在目录,并给他加上可执行权限,这与指定了解释器执行是一样的

变量

shell变量使用需要在变量前面加一个$符号

位置变量: $1-$9 分别代表参数列表中的第1-9个参数

预定义变量 : 系统预留的一些变量
$0:当前进程或者脚本名称
$!:后台运行的最后一个进程的pid号
$?:上一条命令程序返回值
$*:代表所有参数内容
$$:表示当前进程的pid号
$#:表示参数个数
$@:代表所有参数(逐个获取)
在这里插入图片描述

使用双引号可以解析变量,使用单引号会原样输出

在这里插入图片描述

数据类型

shell中默认的数据类型是字符串

Linux下的计算器 – bc

在这里插入图片描述
bc进行数值大小的判断结果:判断结果为真就返回1,结果为假就返回0

整数数值的运算

三种表示方法:

  • $(( 表达式 ))
  • $[ 表达式 ]
  • expr 表达式
    在这里插入图片描述
    注意空格!

表示1到9:

  • {1…9}
    • for i in {1…9}
  • seq
    • for i in `seq9`
    • 输出0到10的偶数 seq 0 2 10
    • 等宽位输出,高位用0补齐seq -w 0 2 10

在这里插入图片描述

获得命令的输出结果

``或$()
在这里插入图片描述

字符串操作

[root@localhost shell_script]# line=`head -n1 /etc/passwd`
[root@localhost shell_script]# echo $line
root:x:0:0:root:/root:/bin/bash

字符串长度
[root@localhost shell_script]# echo ${#line}
31

截取前4个字符
[root@localhost shell_script]# echo ${line:0:4}
root

截取后9个字符
[root@localhost shell_script]# echo ${line:0-9}
/bin/bash

从倒数第九个字符开始截取4个字符
[root@localhost shell_script]# echo ${line:0-9:4}
/bin

从左向右截取最后一个:后的字符
[root@localhost shell_script]# echo ${line##*:}
/bin/bash

从左向右截取第一个:后的字符
[root@localhost shell_script]# echo ${line#*:}
x:0:0:root:/root:/bin/bash

从右向左截取最后一个:后的字符
[root@localhost shell_script]# echo ${line%%:*}
root

从右向左截取第一个:后的字符
[root@localhost shell_script]# echo ${line%:*}
root:x:0:0:root:/root

数组

定义: 使用圆括号,之间以空格分隔

[root@localhost shell_script]# a=(1 2 3 4 5)

输出数组所有元素
[root@localhost shell_script]# echo ${a[@]}
1 2 3 4 5

按下标输出
[root@localhost shell_script]# echo ${a[1]}
2

数组长度
[root@localhost shell_script]# echo ${#a[*]}
5

截取
[root@localhost shell_script]# echo ${a[*]:1:2}
2 3

删除元素,但其他元素的下标不会变
[root@localhost shell_script]# unset a[2]
[root@localhost shell_script]# echo ${a[@]}
1 2 4 5
[root@localhost shell_script]# echo ${a[2]}

[root@localhost shell_script]# echo ${a[3]}
4

for循环中一次取出数组的元素:for i in ${a[@]}

循环

for

第一种方式:

for 变量 in 值1 值2
do
	循环语句
done

第二种方式:

for ((初始化变量;结束循环的条件;运算))
do
	循环执行的语句
done

while

while 条件
do
	执行循环语句
done

也支持break,continue

判断

[]、[[]]、(())都可以用于判断
(())整数值的判断
[]判断字符串的过程中,如果有空白字符,他会进行分词
[[]]不会进行分词,建议使用[[]]进行判断

[ ]表示条件测试。注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格。

语法:

if [ command ];then
    符合该条件执行的语句
elif [ command ];then
    符合该条件执行的语句
else
    符合该条件执行的语句
fi
  • 常用判断
    [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
    [ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。

  • 字符串判断
    [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
    [ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
    [ STRING1 ]  如果字符串不为空则返回为真,与-n类似
    [ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
    [ STRING1 != STRING2 ] 如果字符串不相同则返回为真
    [ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
    [ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

  • 数值判断
    [ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
    [ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
    [ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
    [ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
    [ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
    [ INT1 -le INT2 ] INT1小于等于INT2返回为真,<

  • 逻辑判断
    [ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
    [ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
    [ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
    [ ] || [ ] 用OR来合并两个条件
    [ ] && [ ] 用AND来合并两个条件

  • 类似python的逻辑短路运算
    cmd1 && cmd2 如果cmd1执行成功,或者为真,则执行cmd2
    cmd1 || cmd2 如果cmd1执行不成功,或者为假,则执行cmd2
    cmd1 && cmd2 || cmd3 如果cmd执行成功,就执行cmd2,不成功就执行cmd3

case语句

case $变量名 in
条件1)
	执行语句一
	;;
条件2)
	执行语句二
	;;
*)
执行语句三
esac

函数

定义: 可以用function定义,也可以不使用

a() {

}
或
function a() {

}

调用: 直接用函数名调用 a
如果要接参数: a $1

更多推荐

Python爬虫实战案例——第五例

文章中所有内容仅供学习交流使用,不用于其他任何目的!严禁将文中内容用于任何商业与非法用途,由此产生的一切后果与作者无关。若有侵权,请联系删除。目标:采集三国杀官网的精美壁纸地址:aHR0cHM6Ly93d3cuc2FuZ3Vvc2hhLmNvbS9tc2dzL21XYWxsUGFwZXI=从开发者工具中进行分析可以看到

不可变集合的详细概述

1.不可变集合1.1什么是不可变集合是一个长度不可变,内容也无法修改的集合1.2使用场景如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。当集合对象被不可信的库调用时,不可变形式是安全的。简单理解:不想让别人修改集合中的内容比如说:1,斗地主的54张牌,是不能添加,不能删除,不能修改的2,斗地主的打

在工作流引擎设计领域,是否自动计算未来的处理人的设计模式有哪些?

概述流程的第一个节点发送下去的时候,就要把以后所有节点的处理人计算出来,能清楚的知道每个节点都是那些人处理.以驰骋bpm为例来说明这个设计计算未来处理人包括抄送节点、与待办节点.默认的模式为:每个节点发送的时候即使计算,就是不计算未来处理人.流程设计特征.流程的所有节点的接受人不能是主管选择的,只能是自动计算.节点的转

SpringBoot之yaml

文章目录前言一、基本语法二、数据类型介绍实例三、配置提示总结前言YAML是“YAMLAin’tMarkupLanguage”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是:“YetAnotherMarkupLanguage”(仍是一种标记语言)。非常适合用来做以数据为中心的配置文件。一

奥特曼与钢铁侠【InsCode Stable Diffusion美图活动一期】

文章目录简介图片生成步骤更多体验方式简介InsCode是一个一站式的软件开发服务平台,从开发-部署-运维-运营,都可以在InsCode轻松完成。InsCode的Ins是Inspiration,意思是创作、寻找有灵感的代码。StableDiffusion是文图生成模型,也可以理解成是AI动画生成工具。在线运行地址:htt

数据结构和算法之归并排序

归并排序(MergeSort)是一种基于分治思想的排序算法,通过将待排序的数组分成两个子数组,分别对两个子数组进行排序,最后将排序好的子数组合并成一个有序数组。它的基本思想是将两个有序的子序列合并成一个有序的序列。代码如下://归并排序算法functionmergeSort(arr){//递归出口,当数组长度小于等于1

ELK 企业级日志分析系统

ELK概述1、ELK简介ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求。ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。Ela

Java虚拟机栈

Java虚拟机栈(JavaVirtualMachineStack)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(StackFrame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的

游戏笔记本电脑可以进行 3D 建模和渲染吗?有哪些优势与缺点?

3D建模和渲染是创建令人惊叹的数字艺术、动画和游戏体验的最流行和最广泛使用的工具之一。随着技术的进步,对运行这些模型的强大计算机的需求呈指数级增长。对于那些寻求强大机器来处理3D建模任务的人来说,游戏笔记本电脑已成为一个可行的选择。游戏笔记本电脑适合3d建模吗?游戏笔记本电脑因其性能和便利性而变得越来越受欢迎,而且它们

大数据课程M1——ELK的概述

文章作者邮箱:yugongshiye@sina.cn地址:广东惠州▲本章节目的⚪了解ELK的定义;⚪掌握ELK的使用;一、什么是ELK1.简介ELK是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash和Kibana。2.ELASTIC

【ELK】日志分析系统概述及部署(ELFK部署实验)

目录一、ELK概述1、ELK是什么?2、ELK的组成部分2.1ElasticSearch(1)分片和副本(2)es和传统数据库的区别2.2Kiabana2.3Logstash(1)LogStash主要组件2.4可添加的其它组件3、为什么要使用ELK二、完整日志系统基本特征三、ELK工作原理四、部署ELK日志分析系统实验

热文推荐