linux之shell脚本基础

1.构建基础脚本

1.1 创建shell脚本

1.1.1 第一行需要指定使用的shell

# 用作注释行.shell并不会处理脚本中的注释行,但是第一行的注释,会告诉shell使用哪个shell来运行脚本.

#!/bin/bash

1.1.2 让shell找到你的脚本

直接运行脚本会提示-bash: a.sh: command not found.因为shell会通过PATH环境变量来查找命令,但是很明显PATH里面不存在我们的脚本路径

5653c14ce46245c8945778cd64d09c1a.png

要让shell找到a.sh脚本有两种方法

1)将放置shell脚本的目录添加到PATH环境变量中 29d5ad7ced4a4646b360782a0c93f215.png

2)在命令行中间使用绝对或是相对路径来引用shell脚本 

e1a0547c5b8f4cdab4a6be8e3523aa86.png

1.1.3 给shell脚本赋予执行权限 

因为umask的默认值为022,所以创建出来的文件权限是644,文件没有执行权限,所以需要添加执行权限

f16c1be4d280441e92e6e232ed9c3571.png

5cf8570cbc40487fad4f99a34e836a9b.png 1eb03cc8c74e4b538b55f44ab927c302.png

1.2 echo 显示消息 

1) echo + 字符串,就会显示这个字符串,使用单双引号的不同嵌套方式来实现显示字符串里面存在引号

ff8cb28db0004a8db89995e1926d9fb4.png

6e2a9dbd5709429dacfc6628691f321c.png 2)echo -n将字符串和命令输出在同一行

653ed4018aee455ab21e91d2cdde5fee.png

1.3 使用变量2==

 1.3.1 环境变量

环境变量包括全局环境变量和局部环境变量,全局使用printenv查看,set可以查看所有环境变量.在脚本中间可以在环境变量名前加$来使用他们,但是在shell中间看到$就以为在引用变量,要显示$的话,就需要反斜线来实现转义.

aedad540059f4bbd8cede6b2ad49b65d.png

57deaa0683bf409cbb1a0b9e8787f74d.png

1.3.2 用户自定义变量

自定义变量可以数字字母下划线组成,变量名区分大小写.重要的是变量名=值,三者之间没有空格. 赋值时变量不需要加$,引用时前面需要加$.

1.3.3 命令替换

shell脚本中可以从命令输出中提取信息并将其赋值给变量.将输出赋值给变量之后,就可以在脚本中随意使用了.

有两种方法可以将命令输出给变量:

1) 反引号

4c32b80bb06544ba9e642646128a0427.png

2) $()

9ab625b6948d4d2198724ff57ccdbebd.png

将/usr/bin文件夹下面的的内容,写入到.log文件中,文件名按照当前日期 来进行命名.   

+%y%m%d会将日期显示为两位数字的年月日.                                                                                                                                                          

f0545bb46c4a44958ac20959071f1067.png

ce1a6c8f0f2449db8b4d97d315c8de72.png

1.4 重定向输入和输出

1.4.1 输出重定向

 格式: command > outputfile

会将命令的输出发送至文件里面.重定向运算符会创建新的文件(使用默认的umask设置),如果文件已存在,就会用新数据覆盖已有数据.

格式:command >> outputfile

如果文件已经存在就进行追加而不是覆盖.

1.4.2 输入重定向

格式: command < inputfile

会将文件的内容重定向至命令.

402c8d9d8b854067bd86af373bb48809.png

wc命令可以统计数据中的文本,默认输出3个值,文本的行数,文本的单词数,文本的字节数.

输出的内容为55行,82个单词,994个字节

1.4.3 内联输入重定向

格式:command << marker

data

marker

无需使用文件进行重定向,只需要在命令行中间指定用于输入重定向的数据即可.这个marker作为文本的起止符号.

# !/bin/bash
wc << EOF
test string 1
test string 2
test string 3
EOF

16fd8952f7bf4e8ca97eef06fa6ad77d.png

1.4.4 输入和输出重定向结合使用

格式: command > outputfile <<marker

data

marker

将执行command的输出放入到重定向的文件里面

# !/bin/bash
cat > $(date +%y%m%d).log << EOF
test string 1
test string 2
test string 3
EOF

89c8766632b141f79445e23ccf8c6ffc.png

1.5 管道

格式: command1 | command2

将第一个命令产生的输出传给第二个命令 

1.6 执行数学运算

在bash中将运算结果赋值给变量可以使用$[operation],但是bash shell只是支持整数运算,使用浮点数进行计算时就会报错syntax error: invalid arithmetic operator (error token is ".2+2")

# !/bin/bash
# 加法
var=$[1+2]
echo "这是加法:$var"
# 乘法
var1=$[1*2]
echo "这是乘法:$var1"
# 除法
var2=$[4/2]
echo "这是除法:$var2"

02deb0a8e87b457484f3b7aea5382ac6.png

# 浮点数加法
var=$[1.2+2]
echo "这是加法:$var"

64a478e4f8dd4deeb5bdb2a6289993b5.png

1.7 浮点数解决方案

 1.7.1 bc计算器

最常见的用法是使用内建的bash计算器bc.bash计算器实际上是一种编程语言,允许命令行中间输入浮点数表达式,然后解释并计算该表达式,最后返回结果.bash计算器可以识别以下内容:

1)数字(整数和浮点数)

2)变量(简单的变量和数组)

3)注释(#或是c语言的/**/开始的行

4)表达式

5)编程语句(if-then)

6)函数

支持识别浮点数,使用quit退出bc计算器.

15624c2fcb44400782dac726fc8ae56f.png

 浮点数运算是由内建变量scale来控制的,控制计算结果的小数位.并且bc计算器支持变量,可以使用print打印变量和数字.同时使用bc -q,可以跳过冗长的欢迎信息.

22a863b1b13e452a898a1aa9c3e3ca2c.png

1.7.2 在脚本中使用bc计算器

可以使用命令替换的方式来执行bc命令,将输出结果赋值给变量

格式:

variable=$(echo "options;expression"|bc)

options表示要设置的变量,这个变量可以是多个,用;来分隔它们.expression定义了要执行的数学表达式.

# !/bin/bash
# bc计算器
res=$(echo "scale=4;var1=20;var2=10.0;var3=3.5;var1/var2+var3"|bc)
echo $res

886b76b0d52145c7a785015aaaea4c51.png

expression表达式可以使用shell当中的变量,当然bc计算器里面的变量.仅是在bc中间起到效果.但是此时调用变量就要按照shell的语法规则行事,$变量名

# !/bin/bash
var1=20
var2=10.0
var3=3.5
# bc计算器
res=$(echo "scale=4;$var1/$var2+$var3"|bc)
echo $res

 7a948dbb7c0b4d63af3062e976a1e15b.png

 如果存在大量的计算,一个命令行中间列出多个表达式容易让人感觉头晕.就可以使用内联输入重定向来解决这个问题.

格式:

variable=$(bc<<EOF

options

statements

expressions

EOF)

# !/bin/bash
# bc计算器之内联重定向
var1=20
var2=10.0
var3=3.5
res=$(bc<<EOF
var4=3.6
scale=4
a1=$var1/$var2
b1=$var3+var4
a1+b1
EOF)
echo "bc计算器输出结果为: $res"

d7ebd555434d4fce8387a7415f2069f6.png

1.8 退出脚本

1.8.1 查看退出状态码

 shell中每个命令都是用退出状态码来告诉shell自己已经运行完毕.退出状态码是0~255的整数值.命令结束时会传递给shell,并且可以获取到这个值在脚本中使用.$?中间存储着最后一个已执行命令的退出状态码.成功的命令,退出状态码是0,错误结束的命令,退出状态码是个整数.

422263c78aee42dd85290f5099aab5cd.png

1.8.2 exit命令

exit命令允许脚本结束时指定一个退出状态码 ,退出状态码是在0~255之间,如果退出状态码超过这个范围,结果就是为值/256得到的余数.

3fc19d570fd04ae18260175b7300012a.png

1.9 实战 

编写一个shell脚本计算两个日期之间的天数,允许用户以date命令能识别的任何形式来指定日期.

mac系统和linux系统的形式并不相同,使用date -d "2024-02-21"无法执行,使用下面形式进行替换.

# !/bin/bash
# 编写一个shell脚本计算两个日期之间的天数,允许用户以date命令能识别的任何形式来指定日期
date1="2024-02-21"
date2="2024-03-21"
time=$(date -j -f "%Y-%m-%d" "$date1" +%s)
time2=$(date -j -f "%Y-%m-%d" "$date2" +%s)
echo $time
echo $time2
time3=$[$time2-$time]
echo "两个时间差额的秒数: $time3"
day=$(echo "$time3/24/60/60"|bc)
echo $day

ef71ca9e0705479c8878cf47b6d53c7c.png

2.结构化命令

2.1 if-then语句

格式:

if command

then

        commands

fi 

格式2:

if command;then

        commands

fi 

# !/bin/bash
if pwd &> /dev/null;
thenecho "it worked"
fi

 

2.2 /dev/null 

if后面的command成功运行,退出状态码为0,就会执行then语句,在这里使用了&>/dev/null,

/dev/null是一个特殊的设备文件,它会丢弃所有写入它的数据,读取它会立即返回文件结束(EOF)

2.2.1 丢弃命令的标准输出

command > /dev/null

2.2.2 同时丢弃命令的标准输出和标准错误

command &> /dev/null

2.2.3 只丢弃命令的标准错误

command 2> /dev/null

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一套键盘鼠标控制两台电脑 Mouse Without Borders

有两台电脑&#xff0c;一台笔记本一台台式机&#xff0c;拥有各自拥有鼠标和键盘&#xff0c;但总是需要切换&#xff0c;感觉太麻烦&#xff0c;想找个简单的方式&#xff0c;不需要额外操作就能同时操作这两台电脑。无意间发现了一个微软软件Mouse Without Borders&#xff…

算法体系-13 第十三 二叉树的基本算法+二叉树的递归套路

一 完全二叉树的判断 1.1 描述 完全二叉树&#xff1a;他每一层都是满的&#xff0c;即使不满也是最后一层不满&#xff0c;最后一层不满也是从左到右变满的&#xff1b;话句话说就是 完全二叉树从根结点到倒数第二层满足完美二叉树&#xff0c;最后一层可以不完全填充&#x…

MySQL数据库 - 索引

一. 索引的相关知识 1. 索引的概念 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址&#xff08;类似于C语言的链表通过指针指向数据记录的内存地址&#xff09;使用索引后可以不用扫描全表来定位某行的数据&#xff0c;而是先通过索引表找到该行数据对应…

【Godot 3.5控件】用TextureProgress制作血条

说明 本文写自2022年11月13日-14日&#xff0c;内容基于Godot3.5。后续可能会进行向4.2版本的转化。 概述 之前基于ProgressBar创建过血条组件。它主要是基于修改StyleBoxFlat&#xff0c;好处是它几乎可以算是矢量的&#xff0c;体积小&#xff0c;所有东西都是样式信息&am…

基于Arduino IDE 野火ESP8266模块WIiFi开发

一、函数介绍 头文件 #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h>ESP8266WiFi.h库主要用于连接单个WiFi网络。如果需要连接到多个WiFi网络&#xff0c;例如在需要切换不同网络或者备用网络时&#xff0c;可以使用ESP8266WiFiMulti.h头文件&#xff…

java.lang.String final

关于String不可变的问题&#xff1a;从毕业面试到现在&#xff0c;一个群里讨论的东西&#xff0c;反正码农面试啥都有&#xff0c;这也是我不咋喜欢面试代码&#xff0c;因为对于我而言&#xff0c;我并不喜欢这些面试。知道或不知道基本没啥含氧量&#xff0c;就是看看源代码…

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…

数据结构从入门到精通——二叉树的实现

二叉树的实现 前言一、二叉树链式结构的实现1.1前置说明1.2二叉树的手动创建 二、二叉树的遍历2.1 前序、中序以及后序遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历2.2 层序遍历练习 三、二叉树的具体代码实现二叉树的节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树…

个人网站制作 Part 14 添加网站分析工具 | Web开发项目

文章目录 &#x1f469;‍&#x1f4bb; 基础Web开发练手项目系列&#xff1a;个人网站制作&#x1f680; 添加网站分析工具&#x1f528;使用Google Analytics&#x1f527;步骤 1: 注册Google Analytics账户&#x1f527;步骤 2: 获取跟踪代码 &#x1f528;使用Vue.js&#…

实体框架EF(Entity Framework)简介

实体框架EF&#xff08;Entity Framework&#xff09;简介 文章目录 实体框架EF&#xff08;Entity Framework&#xff09;简介一、概述二、O/R Mapping是什么采用O/R Mapping带来哪些好处 三、Entity Framework架构3.1 下图展示了Entity Framework的整体架构3.2 Entity Framew…

MyBatis:XML操作

&#x1f451;专栏内容&#xff1a;MyBatis⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、MyBatis XML方式1、配置数据库2、指明XML路径3、写持久层代码 二、基础操作1、新增2、删除3、更新4、查找Ⅰ、开启驼峰命…

配置视图解析器

我们在指定视图的时候路径是有重复的&#xff0c;重复的操作可以用视图解析器&#xff0c;让框架帮我们&#xff1a; mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/view/other.jsp"); 配置视图解析器&#xff1a; 注册视图解析器:帮…

202112青少年软件编程(Scratch图形化)等级考试试卷(三级)

第1题:【 单选题】 下列程序哪个可以实现: 按下空格键, 播放完音乐后说“你好! ” 2 秒? ( ) A: B: C: D: 【正确答案】: C 【试题解析】 : 第2题:【 单选题】 执行下列程序, 变量 N 的值不可能是? ( ) A:1 B:4 C:5 D:6 【正确答案】: D 【试题解析】…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

分治法排序:原理与C语言实现

分治法排序&#xff1a;原理与C语言实现 一、分治法与归并排序概述二、归并排序的C语言实现三、归并排序的性能分析四、归并排序的优化 在计算机科学中&#xff0c;分治法是一种解决问题的策略&#xff0c;它将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问…

Expert Prompting-引导LLM成为杰出专家

ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 如果适当设计提示&#xff0c;对齐的大型语言模型&#xff08;LLM&#xff09;的回答质量可以显著提高。在本文中&#xff0c;我们提出了ExpertPrompting&#xff0c;以激发LLM作为杰出专家回…

运动想象 (MI) 迁移学习系列 (14) : EEGNet-Fine tuning

运动想象迁移学习系列:EEGNet-Fine tuning 0. 引言1. 主要贡献2. 提出的方法2.1 EEGNet框架2.2 微调 3. 实验结果3.1 各模型整体分类结果3.2 算法复杂度比较3.3 不同微调方法比较 4. 总结欢迎来稿 论文地址&#xff1a;https://www.nature.com/articles/s41598-021-99114-1#cit…

【算法训练营】周测4

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-4 题目描述 输入格式 从标准输入读入数据。 输入第一行为两个正整…

将main打包成jar;idea打包main为jar包运行

将main打包成jar&#xff1b;idea打包main为jar包运行 适用场景&#xff1a;可以封装一些小工具。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 运行效果&#xff1a; 其中&#xff0c;三方依赖也被…

【Unity】获取游戏对象或组件的常用方法

前言 在Unity开发过程中&#xff0c;我们经常需要获取组件&#xff0c;那么在Unity里如何获取组件呢&#xff1f; 一、获取游戏对象 1.GameObject.Find GameObject.Find 是通过物体的名称获取对象的 所以会遍历当前整个场景&#xff0c;效率较低 而且只能获取激活状态的物体…