SHELL脚本(全是干货)

news2024/10/5 16:32:04

一、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.coloradmin.cn/o/1620871.html

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

相关文章

【Linux】Linux权限管理详解

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;Linux &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 1. Linux权限概念2. 文件访问者分类a) 文件和目录的访问者&#xff1a;b) 文件类型和访问权限 3. 文件权限值的表…

Linux的磁盘分区,格式化,挂载

1.需要提前添加几个磁盘&#xff0c;以做实验 2.把nvme0n2磁盘用来分区实验 3.分了一个主分区&#xff0c;和一个扩展分区&#xff08;扩展分区是不能使用的&#xff0c;所以又在扩展分区里分了一个逻辑分区&#xff09;分区的大小自己定义 4.格式化分出来的区&#xff0c;这…

xgp怎么注册阿根廷账号 微软商店xgp阿根廷账号注册教程

xgp怎么注册阿根廷账号 微软商店xgp阿根廷账号注册教程 xgp游戏平台是微软公司针对pc用户开发的一款游戏平台&#xff0c;在平台内有着知名的月包服务&#xff0c;玩家们只需每个月支付固定的费用&#xff0c;即可免费玩到不同的游戏大作&#xff0c;xgp平台也正是由月包服务…

1.C++入门(下)

目录 1.引用和指针 2.内联函数 2.1 概念&#xff1a; 2.2 特性&#xff1a; 2.3 与宏对比 3.auto关键字 3.1 简介&#xff1a; ​3.2 使用&#xff1a; 3.3 局限 4.基于范围的for循环 1.引用和指针 因为这个面试中常考&#xff0c;就接着上一篇&#xff0c;把这个放…

Linux 底软开发——对CAN的详细操作(周期发送,异常检测,过滤报文)

Linux底软开发—对CAN发送接收详细操作 文章目录 Linux底软开发—对CAN发送接收详细操作1.保证多条CAN数据发送的周期性2.解析CAN报文数据3.CAN总线异常机制应对4.对CAN报文进行过滤操作5.完整的接收报文代码&#xff08;过滤&#xff0c;心跳检测&#xff0c;解析&#xff09;…

刚刚,百度真来炸场了!

文章目录 前言再看文心智能体开发工具&#xff1a;AgentBuilderAI原生应用开发工具&#xff1a;AppBuilder各种尺寸的模型定制工具&#xff1a;ModelBuilder结语 前言 不知道大家还记得不&#xff0c;去年 ChatGPT 火遍全球的时候&#xff0c;国内率先推出 AI 大模型的是百度家…

【热门话题】AI作画算法原理解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 AI作画算法原理解析AI作画算法概述基础原理&#xff1a;机器学习与深度学习卷积…

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 NULL 。…

基于Kepware的Hadoop大数据应用构建-提升数据价值利用效能

背景 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;它允许用户在不需要深入了解分布式底层细节的情况下&#xff0c;开发分布式程序。Hadoop充分利用集群的威力进行高速运算和存储&#xff0c;特别适用于处理超大数据集。 Hadoop的生态系统非常丰富&…

【如何使用chrome开发者工具调试javascript代码】

创作背景 平常开发时我们去解决bug可能会用console.log来来调试&#xff0c;但是断点可以更快地完成工作。 log调试的劣势&#xff1a;但是使用console.log时需要我们手动的打开源码&#xff0c;找到相关代码&#xff0c;插入log语句&#xff0c;然后重新加载页面&#xff0c…

【MySQL】数据库操作指南:数据类型篇

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;MySQL探险日记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 文章目录 1. 数值类型1.1 tinyint 类型1.2 bit 类型1.3 小数类型1.3.1 f…

屏幕状态自动检测+鼠标自动操作

目录 一、写在前面 1.1适用场景 1.2涉及到的库 二、函数库 2.1pyautogui-屏幕截图&鼠标操作 2.1.1屏幕截图screenshot函数 2.1.2鼠标移动及单击 2.2Opencv-模板匹配 2.2.1matchTemplate函数 2.2.2minMaxLoc函数 2.2.3相关代码 2.3base64-图片转base64 2.3.1在线…

顺序表的应用-通讯录

顺序表的应用-通讯录 1.操作2.功能要求2.1.功能要求2.2.思路小结2.3.文件梳理2.4.代码实现"SeqList.h""Contact.h""SeqList.c""Contact.c""test.c" 1.操作 链接: 顺序表专题 这篇文章介绍了顺序表的概念与基本操作。 本文将…

54位大咖演讲精华! 中国生成式AI大会圆满收官,TOP50企业榜单揭晓

54位大咖演讲精华&#xff01; 中国生成式AI大会圆满收官&#xff0c;TOP50企业榜单揭晓© 由 红板报 提供 智东西4月19日报道&#xff0c;为期两天的2024中国生成式AI大会&#xff0c;今日在京圆满收官。 54位产学研投嘉宾代表全程干货爆棚&#xff0c;报名咨询人数逾52…

机械臂模型更换成自己的urdf模块

1.将urdf生成slx文件 smimport(rm_65_flange.urdf);%生成Simscape物理模型 2.更换joint部分&#xff08;对应与几个输入几个输出&#xff09;&#xff08;依次更换&#xff09; 3.更改关节部分&#xff08;依次更换&#xff09; 找到urdf文件夹下的meshes文件夹&#xff0c;看…

python爬虫 - 爬取 json 格式数据(股票行情信息:雪球网,自选股)

文章目录 1. 第一步&#xff1a;安装requests库2. 第二步&#xff1a;获取爬虫所需的header和cookie3. 第三步&#xff1a;获取网页4. 第四步&#xff1a;解析网页5. 第五步&#xff1a;解析 json 结构数据体6. 代码实例以及结果展示 python爬虫五部曲&#xff1a; 第一步&…

Window + Ubuntu 双系统无Ubuntu Bios 启动项

文章目录 安装硬盘位置不重要&#xff01;&#xff01;&#xff01;&#xff08;但是我安装在了第二张HDD&#xff09;问题是多盘分位置会导致磁盘主分区变成了简单卷 Bios Ubuntu 启动项修复参考Ubuntu安装U盘进入Try Ubuntu 使用Terminal修复完提示Disable Secure Boot进入Te…

sublime运行编译C和Java

1.先安装终端 参照以下教程 如何在 Sublime 文本编辑器中使用终端&#xff1f;_sublime终端窗口怎么打开-CSDN博客 可能遇到的问题&#xff1a;有些sublime text3可能并没有显示“package control”。这个问题对于笔者来说是有些吊诡的&#xff0c;因为之前一开始安装时是能…

echarts 堆叠柱状图 顶部添加合计

堆叠有3个&#xff0c;后面加了一个对象显示顶部的数据&#xff0c; 其实主要的代码还是在series 的第四项&#xff0c;需要注意的是 series的第四项中的data需要为 data: [0, 0, 0] 顶部的统计才能显示出来 增加的代码如下 {name: 综合,type: bar,stack: total,label: {sh…

tcp inflight 守恒算法的几何解释

接上文&#xff1a;tcp inflight 守恒算法背后的哲学 在 tcp inflight 守恒算法正确性 中&#xff0c;E bw / srtt 的公平最优解是算出来的&#xff0c;如果自然可以用数学描述&#xff0c;那能算出来的东西反过来也一定能通过直感看出来&#xff0c;我倾向于用几何和力学描述…