Shell编程初识

Shell初识

  • Shell
    • Shell 脚本
    • Shell 环境
    • 第一个shell脚本
      • 实例
    • 运行 Shell 脚本方法:
      • 1、作为可执行程序
      • 2、作为解释器参数
      • 3.使用 . (空格)脚本名称来执行
      • 4.使用 source 来执行(主要用于生效配置文件)
      • 区别
      • 1.关于执行权限
      • 2.关于是否开启子shell线程
    • 脚本排错及问题判断
    • shell中的大括号、中括号、小括号的使用详解
        • **shell中的小括号 "( )"的用法:**
        • **shell中的中括号(也叫方括号) "[ ]"的用法**
        • **大括号 {} :**
    • 重定向与引号
      • 重定向符号的用法
      • 三种引号
    • 数值运算的方法
      • 算术运算符
      • expr 的运用
      • echo $[ ]和echo $(( ))
      • let的运用
      • 小数运算
      • bc科学计算工具的运用
      • **基本计算**
      • **浮点数计算**
    • **bc命令在bash脚本中的应用**
    • 未完待续


Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

Shell 环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
    在这里插入图片描述

第一个shell脚本

打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell)

输入一些代码,第一行一般是这样:

实例

#!/bin/bash*
echo "Hello World ! "

Hello World !

运行 Shell 脚本方法:

1)使用绝对路径执行。
2)使用相对路径执行。语法格式:./a.sh
3)使用 sh或bash命令来执行。语法格式: sh a.sh 不需要执行权限 -x参数(显示执行过程)
4)使用 . (空格)脚本名称来执行。 语法格式:. a.sh 不需要执行权限(特别注意:第一个.后面有空格)
5)使用 source 来执行。 语法格式:source a.sh 不需要执行权限(主要用于生效配置文件)

下面针对这5种方式,我们一起来看看它们的具体使用方式和区别吧!

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

/bin/sh test.sh
bash test.sh

3.使用 . (空格)脚本名称来执行

. test.sh   #注意,点后面有个空格

注:该方式,不需要单独添加x执行权限,它和source类似,权限继承与bash。

4.使用 source 来执行(主要用于生效配置文件)

source test.sh   #该方式多用些操作,被修改后的配置文件(使之重新加载)

区别

1.关于执行权限

仅前两种(相对路径、绝对路径)方法,需要chmod +x test.sh,给脚本单独添加x执行权限。后三种方法,均不需要单独添加x执行权限。

2.关于是否开启子shell线程

前三种方法,脚本执行时会开启一个子shell环境,在子shell执行完后,子shell环境随即关闭,然后又回到当前shell中。

后面两种. 和source方式,则是在当前shell中执行,不会开启子shell。

在这里插入图片描述

脚本排错及问题判断

sh [-nvx] 脚本文件

选项与参数∶

-n:不执行脚本,仅查询语法的问题;

-v:在执行脚本前,先将脚本的内容输出到屏幕上;

-x:将使用到的脚本内容(执行过程)显示到屏幕上

shell中的大括号、中括号、小括号的使用详解

shell中的小括号 "( )"的用法:

() 子shell赋值

在这里插入图片描述

在子shell中变量var值为lookback,但是在上级shell中就不是这个值,可以看出是在子shell中有效的赋值

$()用法
用来执行一条命令

shell中的中括号(也叫方括号) "[ ]"的用法

在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。

my_array=["value1" "value2" "value3"]

条件测试: 中括号用于条件测试,可以用于字符串比较、数值比较等。

bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。

if [ condition ]; then
# commands
fi
大括号 {} :

代码块: 大括号可以用于创建代码块,将一组命令组合在一起。

{
command1
command2
}

扩展: 大括号还可以用于进行扩展,生成一系列字符串。

echo {1..5}
12345

文件重定向: 大括号还可以用于文件重定向。

{ command1; command2; } > output.txt

重定向与引号

重定向符号的用法

重定向符号用于控制命令的输入和输出方向,可以将命令的输出发送到文件、从文件读取输入、追加到文件等。

  • >:将命令的输出重定向到文件,会覆盖文件的内容。
command > output.txt
  • >>:将命令的输出追加到文件,不会覆盖文件的内容。
command >> output.txt
  • <:从文件中读取输入并传递给命令。
command < input.txt
  • 2>: 重定向错误输出的运用
ls abc 2> output.txt
ls abc >output.txt 2>&1
  • 混合输出
ls /opt /xxx &>5.txt

三种引号

  1. 单引号('):
    单引号内的文本会被视为纯粹的字符串,不会对其中的特殊字符进行解释或替换。这意味着,
    单引号中的变量引用、命令替换等都会被直接原样输出。
    例如, ‘Hello $USER’ 会被直接解释为字符串"Hello $USER",而不会将‘USER`替换为当前
    用户名。
    单引号适用于保留字符串中的特殊字符的字面意义。
  2. 双引号("):
    双引号内的文本会进行变量引用和命令替换。也就是说,双引号内的变量会被解释为其对应的
    值,命令替换中的命令会被执行,并将结果嵌入到字符串中。
    例如, “Hello $USER” 会被解释为"Hello"后跟当前用户名。
    双引号适用于需要对字符串中的变量进行扩展或替换的情况。
  3. 反引号(`):
    反引号用于命令替换,即将反引号中的命令执行,并将结果返回到外部命令中。
    例如, date 会被替换为当前日期和时间。
    在现代的Shell中,建议使用更加可读性更好的$(command) 语法来代替反引号。

数值运算的方法

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

expr 的运用

格式:expr 数值1 运算符 数值2 [运算符 数值3]…

echo $[ ]和echo $(( ))

格式:
echo $((数值 运算符 数值))
echo $[数值 运算符 数值]

let的运用

格式:let 变量=<数值>运算符<数值>
运算符与echo $[ ]相同

小数运算

bc科学计算工具的运用

Bash内置了对整数运算的支持,但是并不支持浮点运算,而 bc 计算器可以很方便的进行浮点运算。

  • 支持交互式和非交互式两种方式。
  • 使用scale=n可以指定精度(运算中包含除法才生效),即小数点后的位数。要写在算术表达式之前。

基本计算

bc命令的基本使用方法是在终端中直接输入表达式,然后按下回车键即可得到结果。比如,我们可以执行以下命令进行简单的加法计算:

$ bc
3 + 5

执行以上命令后,bc会输出计算结果:

8

浮点数计算

bc命令默认情况下是整数计算,如果要进行浮点数计算,需要使用"scale"变量设置小数点后的位数。例如,我们可以执行以下命令进行浮点数除法计算:

$ bc
scale=2
7 / 3

输出结果为:

2.33

bc命令在bash脚本中的应用

bc命令在bash脚本中非常实用,特别适合处理需要精确计算的数学运算。由于bash本身只支持整数运算,所以当我们需要进行浮点数计算时,就可以使用bc命令来解决这个问题。下面是一个简单的例子,演示了bc命令在bash脚本中的应用:

#!/bin/bash

# 定义变量
a=5
b=3

# 使用bc命令进行浮点数计算
result=$(echo "scale=2; $a / $b" | bc)

# 输出结果
echo "结果为:$result"

执行以上脚本,将输出结果:

结果为:1.66

未完待续

在这里插入图片描述

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

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

相关文章

dm8 备份与恢复

dm8 备份与恢复 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…

Linux学习之路 -- 进程篇 -- PCB介绍2 -- 标识符和进程创建

前面我们介绍了的进程的标识符&#xff0c;下面继续介绍进程标识符和进程创建的知识。 目录 一、进程创建 <1>fork函数的返回值 <2>创建子进程的目的 <3>代码共享 二、fork函数的相关问题 <1>为什么给父进程返回子进程的pid&#xff0c;给子进程…

数据生成 | Matlab实现基于DE差分进化算法的数据生成

数据生成 | Matlab实现基于DE差分进化算法的数据生成 目录 数据生成 | Matlab实现基于DE差分进化算法的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于DE差分进化算法的数据生成&#xff0c;运行环境Matlab2021b及以上&#xff1b; 2.计…

代码随想录算法训练营Day46|LC139 单词拆分

一句话总结&#xff1a;完全背包&#xff01; 原题链接&#xff1a;139 单词拆分 动态规划之完全背包五部曲&#xff1a; 确定dp数组与下标含义&#xff1a;表示字符串长度为i时&#xff0c;dp[i] true 的话&#xff0c;可以拆分为一个或多个在字典中出现的单词。确定递归公…

C++相关概念和易错语法(4)(构造函数、析构函数)

一、构造函数 1.实现的功能&#xff1a;实例化对象的时候默认自动调用&#xff0c;相当于初始化。 条件&#xff1a;在书写时要满足构造函数的规范&#xff08;函数名 类名&#xff0c;不写返回值&#xff0c;也没有返回值&#xff09;&#xff0c;可以用inline来修饰。 2.自…

Microsoft Edge浏览器设置之后就很牛逼了

1.移除多余的广告 首先我们要先下载Microsoft Edge浏览器浏览器 然后在设置中先打开扩展,安装一个神奇的去广告插件 打开Edge 加载项 直接搜adguard 广告拦截器,直接获取就可以安装了,由于我已经安装过了,所以就是显示的删除。 2.解除网页复制限制 直接在扩展中安装sim…

Toyota Programming Contest 2024#4(AtCoder Beginner Contest 348)(A~D)

A - Penalty Kick i,1~N。如果 i 是 3 的倍数输出x&#xff0c;否则输出o #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);--(i)) #define debug(a) cout<<#…

HTTP详解及代码实现

HTTP详解及代码实现 HTTP超文本传输协议 URL简述状态码常见的状态码 请求方法请求报文响应报文HTTP常见的HeaderHTTP服务器代码 HTTP HTTP的也称为超文本传输协议。解释HTTP我们可以将其分为三个部分来解释&#xff1a;超文本&#xff0c;传输&#xff0c;协议。 超文本 加粗样…

开源 _ 新一代Android 性能监控框架Rabbit

最终扫描结果会展示如下: 点击右上角导出按钮可以把扫描结果以json的形式导出到SD卡中。 网络日志监控 rabbit可以记录网络请求日志并方便的查看返回的json数据: 卡顿日志监控 rabbit通过Choreographer来检测主线程的运行情况,并异步采集主线程堆栈来还原卡顿现场。 对于下…

总包不足80w的高龄Android程序员,被面试官diss混得太差,网友狂吐槽……

有网友直言&#xff1a;90%的人一辈子一年也拿不到80万 有网友分析到&#xff1a;看面试情况&#xff0c;没什么希望就直接其实我觉得30岁年薪低于1000万的都是loser&#xff0c;你我都是 有网友说&#xff1a;这几年互联网行业极大发展&#xff0c;让互联网行业成为了明星行…

2_6.Linux高级存储管理

##1.逻辑卷## pv ##物理卷 被处理过的物理分区 pe ##物理扩展 设定存储最小单元 vg ##物理卷组 捆绑pv到一个组中 lv ##逻辑卷 分配最终的使用设备 监控建立过程&#xff1a; watch -n 1 "pvs;echo ;vgs;echo ;lvs;echo ;df -h /weixindata" &#xff08;1&#xf…

合理早餐选择,稳定糖尿病血糖。

对于糖尿病患者来说&#xff0c;饮食管理是治疗的重要一环。不合理的早餐选择会导致血糖的波动。很多糖尿病朋友按时吃药&#xff0c;但是血糖就是稳定不住&#xff0c;之前看过一个例子&#xff0c;北京崇文门医院朱学敏主任接诊过一个患者&#xff0c;那个患者按时吃药&#…

C++设计模式:装饰器模式(四)

1、定义与动机 装饰器模式定义&#xff1a;动态&#xff08;组合&#xff09;地给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少子类个数&#xff09;。 在某些情…

ARM体系结构

阅读引言&#xff1a; arm架构处理器的基本知识已在上一篇文章中描述过了&#xff0c; 本文将会从arm的存储模型、异常机制、工作模式、指令集、流水线、arm的寄存器组织方面去描述。 目录 一、ARM处理器概论 1.指令集概述 2.指令分类 3.编译流程 二、ARM的存储模型 1.AR…

电商技术揭秘七:搜索引擎中的SEO关键词策略与内容优化技术

文章目录 引言一、关键词策略1.1 关键词研究与选择1. 确定目标受众2. 使用关键词研究工具3. 分析搜索量和竞争程度4. 考虑长尾关键词5. 关键词的商业意图6. 创建关键词列表7. 持续监控和调整 1.2 关键词布局与密度1. 关键词自然分布2. 标题标签的使用3. 首次段落的重要性4. 关键…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中&#xff0c;有一些需要使用全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID&#xff0c;但是UUID有一些缺点&#xff0c;首先他相对比较长&#xff0c…

pyside6怎么使用Qt Designer设计自定义组件

第一步&#xff0c;新建一个自定义组件的python文件 from PySide6.QtWidgets import QPlainTextEdit from PySide6.QtCore import Signal,Qtclass CustomPlainTextEdit(QPlainTextEdit):enterPressed Signal(str)def __init__(self, parentNone):super().__init__(parent)def…

Vue+node.js蔬菜水果农产品网上商城管理系统

用户能够及时掌握最新的数据&#xff0c;并能有效地提升用户的服务水平。本制度的优势在于&#xff1a; &#xff08;1&#xff09;该系统将蔬菜信息及时地提供给使用者。使用者可以在任何时候登陆该网站查询相关资讯&#xff0c;所有资讯均真实可信&#xff0c;并严肃处理各项…

161 Linux C++ 通讯架构实战15,线程池代码分析

线程池应该使用的地方 和 epoll 技术结合 线程池代码处理数据的地方。 线程池分析&#xff1a; 线程池代码1 threadpool_create //Tencent8888 start threadpool_create函数的目的初始化线程池&#xff0c;对应的struct是 threadpool_t /* 1.先malloc整个线程池的大小 2.这里…

牛客 2024春招冲刺题单 ONT98 牛牛猜节点【中等 斐波那契数列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6a3dfb5be4544381908529dc678ca6dd 思路 斐波那契数列参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…