SHELL脚本(全是干货)

一、shell是什么?

1. 1 shell 是一种脚本语言

        脚本语言的本质是一个文件,文件里面存放的是特点格式的指令,系统可以使用脚本解析器翻译或者解析指令,并且执行(它不需要编译)

shell 即是应用程序,又是一种脚本语言(应用程序、解析、脚本语言)

shell命令解析器:

        系统提供shell命令解析器:sh 、ash 、bash等等

        查看自己linux系统的默认解析:echo $SHELL 或者 grep ^root /etc/passwd

echo $SHELL

grep ^root /etc/passwd

 

1. 2  shell的结构

        由底层到应用层如下:

硬件 ——> kernel ——> shell -> 脚本语言

1. 3  用户跟内核通信

        用户使用文字或者图形界面操作系统(用户)

        接受来自用户的命令与内核进行沟通(使用者界面 shell ,KDE,application)

        真正控制硬件进行工作、进程管理,存储管理等(内核 kernel)

        CPU 、 内存、显卡、显示器、硬盘等(硬件hardware)

        shell脚本是一种脚本语言,我们只需要任意文本编译器,按照编写相应的应用程序,增加可执行权限,既可以安装shell命令的环境下运行

1. 4  调用形式

        打开终端时系统自动调用:、etc/profile或者/etc/bashrc

        手动调用:

source /etc/profile
source /etc/bashrc
source /etc/bash.bashrc
source /etc/profile.d/bash_completion.sh
source /etc/bash_completion
source /etc/bash_completion.d/git-prompt.sh
source /etc/bash_completion.d/git-completion.bash
source /etc/bash_completion.d/git-completion.zsh
/etc/profile

        此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里

设置开机自启的程序,一般也在这里设置

~/.bashrc

         用户自己的家用目录中的.bashrc

        登录时会自动调用,打开任意终端时也会自动调用

        这个文件一般设置与个人有关的环境变量,比如交叉编译器的路径等等

        用户手动调用:用户实现的脚本

二、shell 操作

2.1 语法
 2.1.1 定义已开头:
#!/bin/bash

        !:表示这个脚本文件需要使用/bin/bash来执行

        单个“#”号:表示注释,不会被执行

2.1.2 追加执行权限:
chmod   +X day01.sh
2.1.3 执行:
./day01.sh
2.1.4 三种执行方式:
2.1.4.1.直接执行:
    ./day01.sh
2.1.4.2.执行并查看执行结果:
    bash day01.sh
2.1.4.3.执行并查看执行结果:
    sh day01.sh

        ./xxx.sh:先按照文件中#!指定的解析器解析,如果没有,才会使用系统默认的解析器

        bash XXX.sh:指明先按照bash解析,如果没有,才会使用系统默认的解析器

2.2 变量
2.2.1 定义变量:

    变量名=值

    例如:

 name=zhangsan
2.2.2 引用变量:

    ${变量名}

    例如:     

echo ${name}

echo "$name"

echo $name
2.2.3 unset:

    删除变量

    例如:     

   unset name

   echo ${name}
2.2.4 示例
name=zhangsan
echo "name:$name"
echo "请输入姓名:"
read name
echo "name:$name"
echo "请输入年龄:"
read age
echo "age:$age"
if [ $age -gt 18 ];then
    echo "你已经成年了"
else
    echo "你还未成年"
fi

 

 在一行上显示和添加提示需要加上-p:

# 在一行上显示和添加提示需要加上-p
read -p "请输入年龄:" age
if [ $age -gt 18 ];then
    echo "你已经成年了"
else
    echo "你还未成年"
fi

读取多个值:

read -p "请输入姓名:" name age
    echo "name:$name"
    echo "age:$age"
    if [ $age -gt 18 ];then
        echo "你已经成年了"
    else
        echo "你还未成年"
    fi

 

只读变量:(不可修改)

readonly name="zhangsan"
echo $name
name="zhangsan1"
echo $name
name="lisi"
echo $name

 查看环境变量:

echo $PATH

env

2.3 source命令用法:

等号:

 

2.4 预设变量:

例如:

echo "脚本名称:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
echo "第四个参数:$4"
echo "第五个参数:$5"
echo "第六个参数:$6"
echo "第七个参数:$7"
echo "第八个参数:$8"
echo "第九个参数:$9"
echo "第十个参数:$10"
echo "参数个数:$#"
echo "所有参数:$*"
echo "所有参数:$@"

2.5 "" '' `` \ () {}的特殊用法:

name="cdy"
echo "hello $name"
echo 'hello $name'
echo `echo $name`
echo $(echo who am i)
echo `echo "hello 1 \n hello"`
echo `echo -e "hello 1 \n hello"`
age=18
(
    #子shell完成不会影响父shell
    echo $age
    age=19
    echo "里面age: $age"

    echo "里面:$((age+1))"
)
echo "外面age: $age"

2.6 {}由当前的shell执行:
age=18
{
    echo $age
    age=19
    echo "里面age: $age"

    echo "里面:$((age+1))"
}
echo "外面age: $age"

2.7 变量扩展:

2.8 字符串的操作:

2.9  测试[ ]用法:
if [ -d /home/cdy ]
then
    echo "目录存在"
else
    echo "目录不存在"
fi
if [ -f /etc/passwd ]
then
    echo "文件存在"
else
    echo "文件不存在"
fi
if [ -x /etc/passwd ]
then
    echo "文件可执行"
else
    echo "文件不可执行"
fi
if [ -r /etc/passwd ]
then
    echo "文件可读"
else
    echo "文件不可读"
fi
if [ -w /etc/passwd ]
then
    echo "文件可写"
else
    echo "文件不可写"
fi
if [ -s /etc/passwd ]
then
    echo "文件不为空"
else
    echo "文件为空"
fi
2.10 test命令用法:
if test -f /etc/passwd
then
    echo "文件存在"
else
    echo "文件不存在"
fi
if test -d /etc
then
    echo "目录存在"
else
    echo "目录不存在"
fi
if test -r /etc/passwd
then
    echo "文件可读"
else
    echo "文件不可读"
fi
if test -w /etc/passwd
then
    echo "文件可写"
else
    echo "文件不可写"
fi
if test -x /etc/passwd
then
    echo "文件可执行"
else
    echo "文件不可执行"
fi
if test -s /etc/passwd
then
    echo "文件不为空"
else
    echo "文件为空"
fi
if test -e /etc/passwd
then
    echo "文件存在"
else
    echo "文件不存在"
fi
if test -d /etc/passwd
then
    echo "文件是目录"
else
    echo "文件不是目录"
fi

2.11 字符串测试:
if test "abc" = "abc"
then
    echo "字符串相等"
else
    echo "字符串不相等"
fi
if test "abc" != "abc"
then
    echo "字符串不相等"
else
    echo "字符串相等"
fi
name="cdy"
test -z $name
echo $?
read -p "请输入用户名:" name
[ -z $name ]
echo "1:$?"
if [ -z $name ]
then
    echo "用户名不能为空"
else
    echo "用户名不为空"
fi

2.12 数值测试:

2.13 语句测试:

 

2.14 控制语句:

2.15  case:

2.16 for循环语句:

 

2.17 while语法:

2.18 until语法语法:

2.19 continue 和 break:

2.20 函数:

三、总结

        在Shell脚本中,单括号 `[ ]` 和双括号 `[[ ]]` 都用于条件测试,但它们之间存在一些重要的区别:

3.1 单括号 [ ]:

        这是POSIX标准的一部分,所有Unix-like系统兼容。

        在 `[ ]` 中进行条件测试时,需要使用到 `test` 命令,即使在 `[ ... ]` 中并不显式写出 `test` 关键字。

        字符串比较时,不支持模式匹配或者正则表达式。

        对于变量内容,会进行词分割(word splitting)和文件名扩展(globbing)。

        当条件失败时,返回非零退出状态码。

   示例:

    a=2
    b=2
#     # 单括号
   if [ "$a" = "$b" ]; then
     echo "a和b相等"
   fi

 

3.2 双括号 [[ ]]:

Bash shell特有的扩展条件构造,提供了比单括号更多的功能和更友好的语法。

  •         不是所有shell都支持双括号,但在Bash和其他一些现代shell中可用。
  •          双括号内无需使用 `test` 命令。
  •         支持模式匹配(`=~`)操作符,可以配合正则表达式进行字符串比较。
  •         不会进行词分割或文件名扩展。
  •         内部的逻辑可以更灵活,例如支持逻辑运算符 `&&` 和 `||` 直接连接条件。
  •         当条件失败时同样返回非零退出状态码,但错误检查和解析通常更宽容。

额外的区别还包括:

  •         双括号中可以直接使用 `!=`、`>`、`>=`、`<`、`<=` 等比较运算符而不必像
  •         单括号那样加上 `-ne`、`-gt` 等前缀。
  •         双括号支持字符串长度比较,如 `[[ -z $var ]]`;
  •          判断变量是否为空,`[[ ${#var} -gt 5 ]]` 判断变量长度是否大于5。
  •         双括号中的 `==` 和 `!=` 在做字符串比较时,两边不需要转义空格或其他特殊字符(除非这些字符在正则表达式模式匹配中具有特殊意义)。
3.3  $()和$(())的区别 :

 

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

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

相关文章

江开2024年春《大学英语(B)(2) 060052》过程性考核作业4参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1阅读Passage One&#xff0c;回答C-1C-4个问题。请…

高频前端面试题汇总之HTML篇

1. src和href的区别 src和href都是用来引用外部的资源&#xff0c;它们的区别如下&#xff1a; src&#xff1a; 表示对资源的引用&#xff0c;它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应⽤到⽂档内&#xff0c;如请求js脚本。当浏览器解析到该元素…

OpenCV 如何实现边缘检测器

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现拉普拉斯算子的离散模拟 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数…

为什么浏览器打印后会有一个undefined

问题&#xff1a; 原因&#xff1a;浏览器中调试代码&#xff0c;浏览器会默认输出打印语句返回值&#xff0c;多行调试命令返回时只执行最后一个返回值 1、这里没有打印操作&#xff0c;但是返回了1。控制台输出的是调试命令的【返回值】 2、如果调试命令本身就带有打印的语…

C系统编程:从零手搓一个shell

背景 这么久没更新就是在干这件事&#xff01;&#xff01;因为系统编程已经学的差不多了&#xff0c;所以想找几个项目练练手&#xff0c;之前就一直想写一个自己的shell&#xff01;&#xff01;现在终于有机会实现了。 首先说明一下我的操作系统&#xff1a;Arch linux 服务…

HFSS端口介绍2---波端口

前面我们讨论了Lumped Port设定相关的内容,这节我们继续讨论Wave Port(波端口)使用相关的问题。 波端口使用范围 封闭结构:如波导、同轴电缆等 包含多个传播模式的模型 端口平面在求解区域外的模型 模型中包含均匀的波导或者传输线结构 波端口的大小 对于封闭的传输线结构:边…

【C++】vector常用函数总结及其模拟实现

目录 一、vector简介 二、vector的构造 三、vector的大小和容量 四、vector的访问 五、vector的插入 六、vector的删除 简单模拟实现 一、vector简介 vector容器&#xff0c;直译为向量&#xff0c;实践中我们可以称呼它为变长数组。 使用时需添加头文件#include<v…

【御控工业物联网】JAVA JSON结构转换、JSON结构重构、JSON结构互换(5):对象To对象——转换映射方式

御控官网&#xff1a;https://www.yu-con.com/ 文章目录 御控官网&#xff1a;[https://www.yu-con.com/](https://www.yu-con.com/)一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构…

MySQL索引为什么选择B+树,而不是二叉树、红黑树、B树?

12.1.为什么没有选择二叉树? 二叉树是一种二分查找树,有很好的查找性能,相当于二分查找。 二叉树的非叶子节值大于左边子节点、小于右边子节点。 原因: 但是当N比较大的时候,树的深度比较高。数据查询的时间主要依赖于磁盘IO的次数,二叉树深度越大,查找的次数越多,性能…

openstack-镜像封装 7

再克隆两台主机并且安装图形化组件和虚拟化组件 进入图形化界面并安装一个虚拟化管理器 根下创建一个目录&#xff0c;虚拟化管理器新添加一个路径 创建虚拟化 配置虚拟化主机 设置虚拟化主机配置 安装所需软件 清理创建云主机时安装的组件 主机安装虚拟化工具 清理虚拟化缓存 …

Mysql全局优化总结

Mysql全局优化总结 从上图可以看出SQL及索引的优化效果是最好的&#xff0c;而且成本最低&#xff0c;所以工作中我们要在这块花更多时间 服务端系统参数 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_connections…

x汽车登陆网站登陆rsa加密逆向

声明&#xff1a; 本文章内容仅供学习交流&#xff0c;不用于其他其他任何目的&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c; 各位看官好哇&#xff0c;今天给大家带来一篇web自动化逆向的文章&#xff0c;如下图当前我…

CMplot rMVP | 全基因组曼哈顿图和QQ图轻松可视化!

文章目录 1.CMplot1.1 CMplot介绍1.2 CMplot-DEMO1.3 CMplot参数 2.rMVP2.1 rMVP介绍2.2 rMVP-DEMO2.3 rMVP参数 1.CMplot 1.1 CMplot介绍 CMplot&#xff1a;https://github.com/YinLiLin/CMplot 这是一个做全基因组对SNP可视化神器了&#xff0c;尹立林教授写的R包。主打两…

Uptime Kuma 使用指南:一款简单易用的站点监控工具

我平时的工作会涉及到监控&#xff0c;而站点是一个很重要的监控项。项目上线后&#xff0c;我们通常会将站点监控配置到云平台上&#xff0c;以检测各站点的连通性。但随着项目不断增多&#xff0c;云平台上的配额就有点捉急了。针对这个情况&#xff0c;我们可以试试这个开源…

GPT-SoVITS声音克隆训练和推理(新手教程,附整合包)

环境: Win10 专业版 GPT-SoVITS-0421 整合包 问题描述: GPT-SoVITS声音克隆如何训练和推理教程 解决方案: Zero-shot TTS: Input a 5-second vocal sample and experience instant text-to-speech conversion.零样本 TTS:输入 5 秒的人声样本并体验即时文本到语音转换…

CentOS-7安装Mysql并允许其他主机登录

一、通用设置&#xff08;分别在4台虚拟机设置&#xff09; 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入&#xff1a; 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服…

设计模式-00 设计模式简介之几大原则

设计模式-00 设计模式简介之几大原则 本专栏主要分析自己学习设计模式相关的浅解&#xff0c;并运用modern cpp 来是实现&#xff0c;描述相关设计模式。 通过编写代码&#xff0c;深入理解设计模式精髓&#xff0c;并且很好的帮助自己掌握设计模式&#xff0c;顺便巩固自己的c…

【架构方法论(一)】架构的定义与架构要解决的问题

文章目录 一. 架构定义与架构的作用1. 系统与子系统2. 模块与组件3. 框架与架构4. 重新定义架构&#xff1a;4R 架构 二、架构设计的真正目的-别掉入架构设计的误区1. 是为了解决软件复杂度2. 简单的复杂度分析案例 三. 案例思考 本文关键字 架构定义 架构与系统的关系从业务逻…

【亲测有用】idea2024.1中前进后退按钮图标添加

idea更新后&#xff0c;前进后退按钮消失了&#xff0c;现在说下怎么设置 具体操作如下&#xff1a; 1、选择 File / Settings(windows版)&#xff0c;或者Preferences(mac版) 2、打开 Appearance & Behavior 并选择 Menus and Toolbars 3、选择右侧的 “Main toolbar lef…
最新文章