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;
then
	echo "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

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署Alist全平台网盘神器结合内网穿透实现无公网IP访问云盘资源

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-oZuxWTWUiXLx3aQO {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

拌合楼管理系统(九) 地磅称重作弊的方式防范的方法

前言&#xff1a;不谈技术谈谈管理 大宗物资的行业离不开地磅&#xff0c;称重过磅作为运输货物的核心一环&#xff0c;往往很多出现货物损失的情况&#xff0c;都出现在称重作弊&#xff0c;一次作弊就可以导致企业直接的经济损失&#xff0c;让我想起一首古诗硕鼠硕鼠&#x…

LeetCode 21 / 100

目录 矩阵矩阵置零螺旋矩阵旋转图像搜索二维矩阵 II LeetCode 73. 矩阵置零 LeetCode 54. 螺旋矩阵 LeetCode 48. 旋转图像 LeetCode 240. 搜索二维矩阵 II 矩阵 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为…

K8s-网络原理-中篇

引言 本文是《深入剖析 K8s》的学习笔记&#xff0c;相关图片和案例可从https://github.com/WeiXiao-Hyy/k8s_example中获取&#xff0c;欢迎 ⭐️! 上篇主要介绍了 Flannel 插件为例&#xff0c;讲解了 K8s 里容器网络和 CNI 插件的主要工作原理。还有一种“纯三层”的网络方…

【HM】STM32F407 HAL库 定时器

基本概念 兆赫兹 1MHZ&#xff08;兆赫兹&#xff09;是频率的单位&#xff0c;表示每秒周期性震动1,000,000次。 预分频器 不分频 2分频&#xff0c;两个脉冲输出一次 三分频 自动重装载寄存器 当计时器里的计数器自动重装载寄存器值&#xff0c;计数器清零 定时器分类 …

【ESP32 IDF】pwm脉宽调制技术

文章目录 前言一、PWM脉宽调制技术介绍二、pwm的使用2.1 LEDC定时器结构体结构体介绍配置定时器 2.2 配置LEDC通道结构体介绍初始化pwm 2.3 设置占空比设置占空比更新占空比 三、示例代码总结 前言 PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09;是一…

基于yolov5的单目测距实现与总结+相机模型+标定

写这篇文章的目的是为了总结我之前看的标定&#xff0c;相机模型以及单目测距的内容&#xff0c;如果有错误&#xff0c;还请不吝赐教。 参考链接&#xff1a; 相机模型、相机标定及基于yolov5的单目测距实现 深度学习目标检测目标追踪单目测距 单目测距代码部署&#xff08;目…

Linux的基本使用

1.Linux的背景 1.1什么Linux Linux是⼀个操作系统.和Windows是"并列"的关系. 1.2Linux系统的优势 1. 开源(意味着免费,便宜) 2. 稳定(Linux可以运⾏很多年,都不会发⽣重⼤问题) 3. 安全(Linux只有管理员或者特定⽤⼾才能访问Linux内核) 4. ⾃由(不会被强加商业产品和…

点对点协议PPP(数据链路层)

目录 一、点对点协议PPP的特点 二、PPP协议的基本要求 三、PPP协议应满足的需求 四、PPP协议的组成 五、PPP同步传输和异步传输 六、PPP同步传输和异步传输 七、可靠传输问题 八、PPP协议的工作状态&#xff08;同步&#xff09; 九、小结 一、点对点协议PPP的特点 •…

Github 2024-03-21 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10HTML项目1Milvus: 云原生向量数据库与嵌入式相似性搜索 创建周期:1620 天开发语言:Go协议类型:Apache License 2.0Star数量:25568 …

2024.4.11-12中国汽车网络安全及数据安全合规峰

本次安策将在2024年4月11日-12日谈思AutoSec 8周年年会暨中国汽车网络安全及数据安全合规峰会现场展示相关产品&#xff0c;展位号A8&#xff0c;欢迎莅临参观交流。本次会议安策将带给大家汽车行业数据安全合规的最新应用案例。 汽车行业的数字化革命 为推动这场革命&#xff…

Redis进阶(持久化、复制、集群、多线程、缓存)

Redis进阶 1.Redis持久化1.1 什么是Redis持久化&#xff1f;为什么需要持久化&#xff1f;1.2 Redis持久化方式——RDB(Redis DataBase)1.2.1 什么是RDB&#xff1f;1.2.2 备份文件位置1.2.3 触发RDB的方式1.2.3.1 自动触发1.2.3.2 手动触发1.2.3.3 其他触发方式 1.2.4 RDB优缺…

DataEase大屏iframe嵌入自建网站(React)

1、修改dataease 所在的服务器nginx配置 server {listen 80;server_name dataease.ibaiqiu.cn;return 307 https://$host$request_uri; } server {listen 443 ssl;server_name dataease.ibaiqiu.cn;client_max_body_size 30M;ssl_certificate /usr/local/nginx/co…

旅游小程序开发的费用及功能

随着科技的发展和智能手机的普及&#xff0c;越来越多的行业开始利用小程序来进行线上服务。旅游业作为一个重要的服务业&#xff0c;也纷纷推出了自己的旅游小程序&#xff0c;以方便游客在线预订、查询景点信息等。那么&#xff0c;旅游小程序开发的费用是多少&#xff1f;功…

Linux系统编程(笔记)

1、认识计算机系统&#xff08;上&#xff09; 1.1、计算机系统由软硬件构成 1.2、总线 1.3、I/O设备 1.4、内存 1.5、处理器 1.6、计算机硬件组成 2、认识计算机系统&#xff08;下&#xff09; 2.1、什么是操作系统 2.2、Linux内核模块 2.3、操作系统管理硬件&#xff08;职…

OpenLayers基础教程——使用WebGL加载海量数据(1)

1、前言 最近遇到一个问题&#xff1a;如何在OpenLayers中高效加载海量的场强点&#xff1f;由于项目中的一些要求&#xff0c;不能使用聚合的方法加载。一番搜索之后发现&#xff1a;OpenLayers中有一个WebGLPoints类&#xff0c;使用该类可以轻松应对几十万的数据量&#xf…

鸿蒙一次开发,多端部署(三)应用UX设计原则

设计原则 当为多种不同的设备开发应用时&#xff0c;有如下设计原则&#xff1a; 差异性 充分了解所要支持的设备&#xff0c;包括屏幕尺寸、交互方式、使用场景、用户人群等&#xff0c;对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外&#xff0c;还…

【CSS】flex弹性盒保持均分

通过Flex布局可以将容器均分&#xff0c;给每个小容器设置相同的flex-grow即可。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&…

白话讲人工智能、机器学习、深度学习

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09; 定义&#xff1a; 想象一个聪明的机器人&#xff0c;它能思考、决策和学习&#xff0c;就像电影里的智能角色那样。人工智能就是努力打造这样的智能实体的学科&#xff0c;它试图模仿、扩展乃至超越人…

【精彩回顾】百度智能云千帆产品3月21日发布会

3月21日&#xff0c;AI Cloud Day&#xff1a;百度智能云千帆产品发布会在北京举办。会议聚焦百度智能云千帆大模型平台最新进展&#xff0c;分享思考与实践。百度智能云在发布会期间宣布&#xff1a; >>满足企业“效价比”核心诉求&#xff0c;千帆ModelBuilder大模型服…