【shell】

shell

  • 一、shell简介
  • 二、shell脚本的执行方式
  • 三、shell变量
    • 3.1 shell变量介绍
    • 3.2 shell变量的定义
      • 3.1.1 基本语法
      • 3.2.2 定义变量的规则
      • 3.2.3 将命令的返回值赋予变量
  • 四、环境变量的设置
    • 4.1 基本语法:
  • 五、位置参数变量
    • 5.1 基本介绍
    • 5.2 基本语法
  • 六、预定义变量
    • 6.1 基本介绍
    • 6.2 基本语法
  • 七、运算符
  • 九、流程控制
    • 9.1 if 条件判断
    • 9.2 常用判断条件:
    • 9.3 case语句
    • 9.4 for循环
    • 9.5 while循环
    • 9.6 read读取控制台输入
      • 9.6.1 基本语法:read [选项] [参数]
      • 9.6.2 用法:
      • 9.6.3 参数说明:
      • 9.7.4 .参数解读实例:
        • 9.7.4.1 -a 参数
        • 9.7.4.2 -d
        • 9.7.4.3 -p
        • 9.7.4.4 -n
        • 9.7.4.5 -r
        • 9.7.4.6 -s
        • 9.7.4.7 -t
        • 9.7.4.8 -u
  • 十、shell函数
    • 10.1 系统函数
      • 10.1.1 basename函数
      • 10.1.2 dirname函数
    • 10.2 自定义函数
  • 十一、在 Shell 脚本中调用另一个 Shell 脚本的三种方式
    • 11.1 fork
    • 11.2 exec
    • 11.3 source
  • 十二、等待.sh脚本仅在另一个脚本完成后才能运行?
    • 12.1 &&连接器
    • 12.2 连接器

一、shell简介

shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。

二、shell脚本的执行方式

1.脚本以#!/bin/bash开头
2.脚本需要有可执行权限

三、shell变量

3.1 shell变量介绍

1.Linux shell中的变量分为系统变量和用户自定义变量
2.系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等
3.显示当前shell中的所有变量:set

3.2 shell变量的定义

3.1.1 基本语法

1.定义变量:变量=值
2.撤销变量:unset 变量
3.声明静态变量:readonly 变量(静态变量声明后不能撤销)
4.多行注释的写法::<<! txt !(开头和结尾都单独一行)

3.2.2 定义变量的规则

1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头
2.等号两侧不能有空格.
3.变量名称一般习惯为大写.

3.2.3 将命令的返回值赋予变量

1.A=‘date’反引号,运行里面的命令,并把结果返回给变量A
2.A=$(date)等价于反引号

四、环境变量的设置

4.1 基本语法:

1.export 变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量)
2.source 配置文件(功能描述:让修改后的配置信息立即生效)
3.echo $变量名(功能描述:查询环境变量的值)

五、位置参数变量

5.1 基本介绍

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。

5.2 基本语法

$n(功能描述:n为数字,$0代表命令本身,$1- 9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10})
∗ (功能描述:这个变量代表命令行中所有的参数, *(功能描述:这个变量代表命令行中所有的参数, (功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)
@ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
$#(功能描述:这个变量代表命令行中所有的参数个数)

六、预定义变量

6.1 基本介绍

shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。

6.2 基本语法

$$ (功能描述:当前进程的进程号(PID))
$!(功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

七、运算符

基本语法:
1. ( ( 运算符 ) ) 或者 ((运算符))或者 ((运算符))或者[运算式]或者expr m + n
2.注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用反引号或者$
3.expr *,/,%分布代表乘,除,取余

九、流程控制

9.1 if 条件判断

基本语法:(注意condition前后要有空格)

if [ condition ]
then 语句
elif
then 语句
fi

9.2 常用判断条件:

字符串比较(=)
两个整数的比较-lt(小于)                    //less than   小于-le(小于等于)            // -eq(等于)                  //equal  等于-gt(大于)                   //greater than 大于-ge(大于等于)          //-ne(不等于)              //
按照文件权限进行判断-r (有读的权限)-w (有写的权限)-x(有执行的权限)
按照文件类型进行判断-f (文件存在并且是一个常规文件)-e(文件存在)-d(文件存在并是一个目录)

9.3 case语句

case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

9.4 for循环

基本语法1for 变量 in 值123...
do
程序
done基本语法2for((初始值;循环控制条件;变量变化))
do
程序
done

9.5 while循环

while [ 条件判断式 ]
do
程序
done

在这里插入图片描述

9.6 read读取控制台输入

9.6.1 基本语法:read [选项] [参数]

选项:

  • -p:指定读取值时的提示符
  • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。

9.6.2 用法:

  • 用于从标准输入读取数据(键盘)
  • 也可以从文件中读取(此时是读取一行文件)
    read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name…]

9.6.3 参数说明:

  • -a 后面跟一个变量,该变量会被认为为数组,然后给其复制,默认是以空格为分隔符
  • -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志
  • -p 后面跟提示信息,即在输入前面打印提示信息
  • -e 在输入的时候可以使用,命令补全功能
  • -n 后面跟一个数字,定义输入文本的长度,很实用
  • -r 屏蔽\,若没有该选项,则\作为一个转义字符,有的话反斜杠就是个正常的字符了。
  • -s 安静模式,在输入字符时不再屏幕上面显示(常用于输入密码)
  • -t 后面跟秒数,定义输入字符的等待时间
  • -u 后面跟fd,从文件描述符中读取,该文件描述符可以是exec新开启的

9.7.4 .参数解读实例:

9.7.4.1 -a 参数
  • 从键盘读取一组数据进行四则运算
    read -a score #读取三个元素进入score数组
    echo ${score[@]} #挨个输出score数组中的元素,不换行

  • 输出结果
    输入:11 12 13
    输出:11 12 13

9.7.4.2 -d
  • 限定读取到那一个字符停止读取,比如下面就是限定读取到字符s,只有第一个字符重要
    read -d sscsc v
    echo -e “\n”
    echo $v
9.7.4.3 -p
  • -p选项是为了显示提示信息
    read -p “请输入你的密码:” passward
    echo $passward

  • 结果
    $ bash 1.sh
    请输入你的密码:1234567
    1234567

9.7.4.4 -n
  • 定义输入密码的长度为8
    read -n8 -p “请输入你的密码:” passward #控制密码的
    echo -e “\n”
    echo -e $passward
  • 输出结果
    请输入你的密码:12345678
    12345678
9.7.4.5 -r
  • 读取一段字符串 123adda\ncsdd
    read -r -p “请输入字符串” str
    echo -e “\n”
    echo $str

  • 输出结果
    请输入字符串123adda\ncsdd

123adda\ncsdd

9.7.4.6 -s
  • 这个选项常和-p一起使用
    read -p “请输如你的密码:” -s -n8 passward
    echo -e “\n密码”
    echo $passward

  • 输出结果
    请输如你的密码:
    密码
    12345678

9.7.4.7 -t
  • 指定输入字符的等待时间就好像那些输入验证码的程序,输错了第次就要等待时间再次进行输入
9.7.4.8 -u
  • 创建两个文件1.txt,2.txt,然后拼接两个文件的第三行和第四行
    $ cat 1.xtxt
    a
    b
    c
    d
    $ cat 2.txt
    1
    2
    3
    4

while read -u2 i && read -u3 j
do
echo $i $j
done 2<1.txt 3<2.txt

  • 输出结果
    a 1
    b 2
    c 3
    d 4

十、shell函数

10.1 系统函数

10.1.1 basename函数

功能:返回完整路径最后/的部分,常用于获取文件名
基本语法:basename [pathname] [suffix](功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来)。
选项:suffix为后缀,如果被指定,basename会将pathname中的suffix去掉。

10.1.2 dirname函数

功能:返回完整路径最后/前面的部分,常用于返回路径部分。
基本语法:dirname 文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

10.2 自定义函数

[ function ] funcname()
{
Action;
[return int;]
}

十一、在 Shell 脚本中调用另一个 Shell 脚本的三种方式

11.1 fork

fork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell 执行完毕后返回父 Shell。 子 Shell 从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回父 Shell。

11.2 exec

exec 与 fork 不同,不需要新开一个子 Shell 来执行被调用的脚本. 被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。这是 exec 和 source 的区别.

11.3 source

与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。

十二、等待.sh脚本仅在另一个脚本完成后才能运行?

12.1 &&连接器

只需使用&&连接器(即复合命令):
./script1.sh && ./script2.sh
1
但是请注意,只有script1.sh 即第一个脚本退出代码为0(即没有错误)时,才会执行第二个脚本。

12.2 连接器

如果要执行序列,无论第一个脚本的结果如何,只需执行以下操作
./script1.sh ; ./script2.sh

您可以测试两个连接器的行为:
$ true && echo aa
aa
$ false && echo aa
$ false ; echo aa
aa

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

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

相关文章

nginx的反向代理和负载均衡

nginx的反向代理和负载均衡&#xff1a; 代理&#xff1a;客户端通过一个指定的服务器&#xff0c;访问其他服务器&#xff0c;请求和响应都由指定服务器来为客户端进行处理&#xff0c;这个指定的服务器就是代理服务器 代理的方式&#xff1a; 四层代理&#xff1a;四层就是…

操作系统概述及发展史、Linux内核、发行版及应用领域

一、 操作系统&#xff08;Operation System&#xff0c;OS&#xff09; 裸机&#xff1a;没有安装操作系统的计算机 如果想在 裸机 上运行自己所编写的程序&#xff0c;就必须用机器语言书写程序如果计算机上安装了操作系统&#xff0c;就可以在操作系统上安装支持的高级语言…

python pyaudio实时读取音频数据并展示波形图

python pyaudio实时读取音频数据并展示波形图 下面代码可以驱动电脑接受声音数据&#xff0c;并实时展示音波图&#xff1a; import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import pyaudio import wave import os import op…

面试官:说说synchronized与ReentrantLock的区别

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了&#xff0c;一些概念和操作已经模糊。 最近与人聊起SQL注入&#xff0c;重新翻阅&#xff0c;暂记于此。 重点&#xff1a;敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

力扣124. 二叉树中的最大路径和(java DFS解法)

Problem: 124. 二叉树中的最大路径和 文章目录 题目描述思路解题方法复杂度Code 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经…

【C++】类和对象——const修饰成员函数和取地址操作符重载

在上篇博客中&#xff0c;我们已经对于日期类有了较为全面的实现&#xff0c;但是&#xff0c;还有一个问题&#xff0c;比如说&#xff0c;我给一个const修饰的日期类的对象 这个对象是不能调用我们上篇博客写的函数的&#xff0c;因为&d1是const Date*类型的&#xff…

备战春招——12.04 算法

哈希表 哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_&#xff0c;完成映射操作&#xff0c;主要是相应的函数。map和set是有序的&#xff0c;使用的是树的形式&#xff0c;unordered_map和unordered_set使用的是散列比表的&#xff0c;无序。 相应函数…

【Java】类和对象之超级详细的总结!!!

文章目录 前言1. 什么是面向对象&#xff1f;1.2面向过程和面向对象 2.类的定义和使用2.1什么是类&#xff1f;2.2类的定义格式2.3类的实例化2.3.1什么是实例化2.3.2类和对象的说明 3.this引用3.1为什么会有this3.2this的含义与性质3.3this的特性 4.构造方法4.1构造方法的概念4…

【VRTK】【VR开发】【Unity】10-连续移动

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 连续移动与瞬移有如下不同: 连续移动不容易打断沉浸对于新手或者不适应者来说更容易晕动 我对玩家的建议:连续移动前后左右可以用摇杆,转向用自己…

低代码如何降低门槛、快速交付、实现可持续IT架构?

目录 低代码开发模式期望达成的目标 1.降低开发门槛 2.加快系统交付 3.建立可持续发展的IT架构 写在最后 低代码的概念&#xff0c;最早提出的时间是在2014年左右&#xff0c;随后一直处于上升期&#xff0c;随着前两年阿里、腾讯的相继入场&#xff0c;竞争逐步加大。低代…

设计简单高效的短链系统

目录 引言 1. 短链系统的原理 1.1 长链接生成短码 1.2 短码映射到长链接 1.3 短码重定向 1.4 过期短 URL 清理 2. 设计与实现 2.1 数据存储 2.2 短码生成 2.3 接口设计 2.4 安全性考虑 2.5 访问性能优化 引言 在当今数字化时代&#xff0c;人们对信息的分享需求不断…

市场缺口投资者应该怎么做? 昂首资本一招就能盈利

当在市场交易分析中&#xff0c;投资者发现市场缺口或者价格缺口的时候&#xff0c; 昂首资本问各位投资者应该怎么才能抓住机会盈利一波。 其实在技术分析中的这个术语指的是&#xff1a;前一根棒线的收盘价和下一根棒线的开盘价之间有差距的情况。例如&#xff0c;当做市商将…

【SpringBoot系列】SpringBoot时间字段格式化

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Allegro无法模块复用的解决办法

Allegro无法模块复用的解决办法 在用Allegro做PCB设计的时候,模块复用是使用的比较频繁的功能,对于有相同模块的单板,可以节省大量的时间。 模块复用的功能不细说,具体参考以前的文章。 有时会遇到模块复用的时候出现如下报错 无法匹配,有时如果因为Device而无法复用,就…

python提取通话记录中的时间信息

您需要安装适合中文的SpaCy模型。您可以通过运行 pip install spacypython -m spacy download zh_core_web_sm来安装和下载所需的模型。 import spacy# 加载中文模型 nlp spacy.load(zh_core_web_sm)# 示例电话记录文本 text """ Agent: 今天我们解决一下这…

Linux CentOS7 安装Docker

CentOS7安装Docker&#xff1a; Docker简介 Docker是一个开源的容器化平台&#xff0c;可帮助开发者轻松地创建、部署和运行应用程序。Docker使开发人员能够在一个独立的容器中打包应用程序及其依赖项&#xff0c;这样他们就可以轻松地将应用程序移植到任何其他环境中。Docke…

基础堆溢出原理与DWORD SHOOT实现

堆介绍 堆的数据结构与管理策略 程序员在使用堆时只需要做三件事情&#xff1a;申请一定大小的内存&#xff0c;使用内存&#xff0c;释放内存。 对于堆管理系统来说&#xff0c;响应程序的内存使用申请就意味着要在"杂乱"的堆区中"辨别"出哪些内存是正在…

Python实现交易策略评价指标-夏普比率

1.夏普比率的定义 在投资的过程中&#xff0c;仅关注策略的收益率是不够的&#xff0c;同时还需要关注承受的风险&#xff0c;也就是收益风险比。 夏普比率正是这样一个指标&#xff0c;它表示承担单位的风险会产生多少超额收益。用数学公式描述就是&#xff1a; S h a r p R…

【算法每日一练]-图论(保姆级教程 篇6(图上dp))#最大食物链 #游走

目录 题目&#xff1a;最大食物链 解法一&#xff1a; 解法二&#xff1a; 记忆化 题目&#xff1a;游走 思路&#xff1a; 题目&#xff1a;最大食物链 解法一&#xff1a; 我们标记f[i]是被f[x]捕食的点对应的类食物链数 不难得出&#xff1a; f[x]∑(f[i]) 首先从生…