【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.rhkb.cn/news/210508.html

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

相关文章

C++ Primer 第十六章 模板与泛型编程 重点解读

文章目录 1 定义模板1.1 类模板成员函数的实例化&#xff1a;1.2 在类代码内简化模板类名的使用&#xff1a;1.3 令模板自己的类型参数成为友元&#xff08;C11&#xff09;1.4 模板类型别名1.4.1 typedef1.4.2 为模板定义类型别名(C11) 1.5 函数模板与类模板的区别1.6 使用类的…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载&#xff1a;https://download.vulnhub.com/cereal/Cereal.ova 靶场难度&#xff1a;困难 发布日期&#xff1a;2021年5月29日 文件大小&#xff1a;1.1 GB 靶场作者&#xff1a;Thomas…

外包干了4年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Rocky Linux 9.3 为 PowerPC 64 位带回云和容器镜像

RHEL 克隆版 Rocky Linux 9.3 今天发布了&#xff0c;作为红帽企业 Linux 发行版 CentOS Stream 和 Red Hat Enterprise Linux 的免费替代版本&#xff0c;现在可供下载。 Rocky Linux 9.3 是在 Rocky Linux 9.2 发布 6 个月之后发布的&#xff0c;它带回了 PowerPC 64 位 Lit…

如何正确使用高防IP?高防IP使用教程

随着网络攻击的日益猖獗&#xff0c;越来越多的企业开始重视网络安全&#xff0c;并选择使用高防IP来保护自己的服务器。但是&#xff0c;使用高防IP并不是简单的开通服务就能够达到防护效果的&#xff0c;它需要正确的使用方法才能够发挥出应有的作用。 本文将向大家介绍如何正…

公有云迁移研究——AWS DMS

大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时&#xff0c;往往会遇到数据库迁移的任务。如果数据量不是特别大&…

一篇吃透大厂面试题,2024找工作一帆风顺。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

MySQL -DDL 及表类型

DDL 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1.CHARACTER SET&#xff1a…

Python查看文件列表

os.listdir 是 Python 的一个内置函数&#xff0c;用于列出指定目录中的所有文件和子目录。它接受一个字符串参数&#xff0c;即要列出内容的目录的路径。 列出当前工作目录中的所有文件和子目录 files_and_dirs os.listdir() print(files_and_dirs) 列出指定目录中的所…

支付宝沙箱支付

1. 二维码 1.1 什么是二维码&#xff1a; ​ 二维码又称QR Code&#xff0c;QR全称Quick Response&#xff0c;是一个近几年来移动设备上超流行的一种编码方式&#xff0c;它比传统的Bar Code条形码能存更多的信息&#xff0c;也能表示更多的数据类型。 ​ 二维条码/二维码&…

LeetCode437.路径总和III

看完题目我就拿直接用递归写了如下代码&#xff1a; class Solution {private int ans;public int pathSum(TreeNode root, int targetSum) {ans 0;dfs(root, targetSum, 0);return ans;}public void dfs(TreeNode root, int targetSum, int sum){if(root null)return;sum r…

深入解析JVM内存结构:Metaspace、堆与垃圾收集器

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Mysql进阶-事务锁

前置知识-事务 事务简介 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 就比如: 张三给李四转账1000块钱&#xff0…

龙迅#LT8311X3 USB中继器应用描述!

1. 概述 LT8311X3是一款USB 2.0高速信号中继器&#xff0c;用于补偿ISI引起的高速信号衰减。通过外部下拉电阻器选择的编程补偿增益有助于提高 USB 2.0 高速信号质量并通过 CTS 测试。 2. 特点 • 兼容 USB 2.0、OTG 2.0 和 BC 1.2• 支持 HS、FS、LS 信令 • 自动检测和补偿 U…

Python+Requests模块添加cookie

请求中添加cookies 对于某些网站&#xff0c;登录然后从浏览器中获取cookies&#xff0c;以后就可以直接拿着cookie登录了&#xff0c;无需输入用户 名密码。 一、在参数中添加cookie 在发送请求时使用cookies 代码示例&#xff1a; import requests # 1&#xff0c;在参数…

文心一言 VS 讯飞星火 VS chatgpt (150)-- 算法导论12.2 6题

六、用go语言&#xff0c;考虑一棵二叉搜索树 T &#xff0c;其关键字互不相同。证明&#xff1a;如果 T 中一个结点 x 的右子树为空&#xff0c;且 x 有一个后继 y &#xff0c;那么 y 一定是 x 的最底层祖先&#xff0c;并且其左孩子也是 x 的祖先。(注意到&#xff0c;每个结…

深入浅出 Linux 中的 ARM IOMMU SMMU III

系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的 dma_alloc_coherent()/dma_alloc_attrs() 等接口。dma_alloc_coherent()/dma_alloc_attrs() 等接口通过 DMA IOMMU 的回调分配内存&#xff0c;并为经过 IOMMU 的 DMA 内…

微信小程序之猜数字和猜拳小游戏

目录 效果图 app.json 一、首页&#xff08;index3&#xff09;的代码 wxml代码 wxss代码 二、猜数字页面&#xff08;index&#xff09;代码 wxml代码 wxss代码 js代码 三.游戏规则页面&#xff08;logs&#xff09;代码 wxml代码 wxss代码 四.猜拳页面&#xff…

java--接口概述

1.认识接口 ①java提供了一个关键字interface&#xff0c;用这个关键字我们可以定义出一个特殊的结构&#xff1a;接口。 ②注意&#xff1a;接口不能创建对象&#xff1b;接口是用来被类实现(implements)的&#xff0c;实现接口的类称为实现类。 ③一个类可以实现多个接口(接…

Web安全-初识SQL注入(一)

1、初识SQL注入 1.1、什么是注入&#xff1f; 将不受信任的数据作为命令或查询的一部分发送到解析器时&#xff0c;会产生诸如SQL注入、NoSQL注入、OS 注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。 注入能导…