[Linux][Shell][Shell基础] -- [Shebang][特殊符号][变量][父子Shell]详细讲解

目录

  • 0.前置知识
  • 1.Shebang
  • 2.Linux特殊符号整理
  • 3.变量
  • 4.环境变量
  • 5.父子shell
    • 0.概念
    • 1.创建进程列表(创建子shell执行命令)
  • 6.内置命令 vs 外置命令


0.前置知识

  • #用于注释
  • shell脚本语⾔属于⼀种弱类型语⾔:⽆需声明变量类型,直接定义使⽤
  • shell三剑客:grep、sed、awk
  • shell编程,尽量⽤内置系统操作,与内置函数

1.Shebang

  • 计算机程序中,Shebang指的是出现在⽂本⽂件的第⼀⾏前两个字符#!
  • 在Unix系统中,程序会分析Shebang后⾯的内容,作为解释器的指令,例如:
    • #!/bin/sh开头的⽂件,程序在执⾏的时候会调⽤/bin/sh,也就是bash解释器
    • #!/usr/bin/python开头的⽂件,代表指定Python解释器去执⾏
    • #!/usr/bin/env解释器名称,是⼀种在不同平台上都能正确找到解释器的办法
  • 注意事项
    • 如果脚本未指定Shebang ,脚本执⾏的时候,默认⽤当前shell去解释脚本,即$SHELL
    • 如果Shebang指定了可执⾏的解释器,如/bin/bash /usr/bin/python,脚本在执⾏时,⽂件名会作为参数传递给解释器
    • 如果#!指定的解释程序没有可执⾏权限,则会报错“bad interpreter: Permission denied”
    • 如果#!指定的解释程序不是⼀个可执⾏⽂件,那么指定的解释程序会被忽略,转⽽交给当前的SHELL去执⾏这个脚本
    • 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”
    • #!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会⾃动到$PATH中寻找解释器的
    • 如果使⽤bash test.sh这样的命令来执⾏脚本,那么#!这⼀⾏将会被忽略掉,解释器当然是⽤命令⾏

2.Linux特殊符号整理

  • ${vars}:取值变量的值
  • $():在括号中执行命令,且拿到命令的执行结果
  • ` `:在括号中执行命令,且拿到命令的执行结果
  • ():开启子shell执行命令结果
  • $vars:取出变量值

3.变量

  • 变量定义与赋值,注意变量与值之间不得有空格

    • 变量类型:bash默认把所有变量都认为是字符串
    • bash变量是弱类型,无需事先声明变量类型,声明和赋值同时进行
      name="SnowK"
      
  • 变量替换/引用

    name="SnowK"
    echo ${name}
    echo $name # {}可以省略
    
  • 变量名规则

    • 名称定义要做到⻅名知意,切按照规则来,切不得引⽤保留关键字
    • 只能包含数字、字⺟、下划线
    • 不能以数字开头
    • 不能⽤标点符号
    • 变量名严格区分⼤⼩写
  • 变量的作用域

    • 本地变量:只针对当前的shell进程
    • 环境变量:也称为全局变量,针对当前shell以及其任意子进程
      • 环境变量也分自定义、内置两种环境变量
    • 局部变量:针对在shell函数或是shell脚本中定义
  • 位置参数变量:用于shell脚本中传递的参数

    • 例如ls -l,中的-l就是位置参数变量
  • 特殊变量:shell内置的特殊功能变量

    • $?
      • 0:成功
      • 1~255:错误码
  • 自定义变量

    • 变量赋值varName=value
    • 变量引用${varName}、$varName
      • 单引号变量,不识别特殊语法
      • 双引号变量,能识别特殊语法
  • 不同的执行方式,不同的shell环境

    • 每次调⽤bash都会开启⼀个⼦shell,因此不保留当前的shell变量
    • 调⽤source或者.符号,是在当前shell环境加载脚本,因此保留变量
  • 在Linux中,反引号中的命令的执行结果会被保留下来(存进对应的变量中)


4.环境变量

  • 环境变量:⼀般指的是⽤export内置命令导出的变量,⽤于定义shell的运⾏环境、保证shell命令的正确执⾏
    • shell通过环境变量确定登录的⽤户名、PATH路径、⽂件系统等各种应⽤
  • 环境变量可以在命令⾏中临时创建,但是⽤户退出shell终端,变量即丢失,如要永久⽣效,需要修改环境变量配置⽂件
    • 用户个人配置文件
      • ~/.bash_profile
      • ~/.bashrc:远程登陆用户特有文件
    • 全局配置文件:修改全局配置文件,影响所有登陆系统的用户
      • /etc/profile
      • /etc/bashrc
      • 系统建议最好创建在/etc/profile.d/,而非直接修改主文件
    • 以个人配置文件,优先加载、读取、生效
  • 检查系统环境变量的命令
    • set:输出所有变量,包括全局变量、局部变量
    • env:只显示出全局变量
    • declare:输出所有的变量,如同set
    • export:显示和设置环境变量值
  • 撤销环境变量unset 变量名:删除变量或函数
  • 设置只读变量readonly:只有shell结束,只读变量才失效
  • 环境变量初始化与加载顺序
    请添加图片描述

5.父子shell

0.概念

  • 父子shell

    • source.,执行脚本,只在当前的shell环境中执行生效

    • 指定bash sh解释器运行脚本,是开启subshell,开启子shell运行脚本命令

    • ./script,都会指定Shebang,通过解释器运行,也是开启subshell运行命令

      请添加图片描述

  • 子shell
    请添加图片描述

  • 多个子shell
    请添加图片描述

1.创建进程列表(创建子shell执行命令)

  • 为什么学习子shell?意义在哪里?
    • 为了某个指令不卡住当前shell,开启子shell以达到异步的目的
    • 实现多进程的处理,提高程序并发执行效率
  • 进程列表:加上(),开启子shell运行命令,并且子shell是可以嵌套运行的
    (cd ~; pwd; ls; cd /tmp; pwd; ls)
    (pwd; (echo $BASH_SUBSHELL))
    
  • 检测是否在子shell环境中BASH_SUBSHELL:该变量的值特点
    • 如果是0,就是在当前shell环境中执行的
    • 否则就是开辟子shell去运行的
  • 示例
    • 检测是否开启了子shell运行命令
      • cd ~; pwd; ls; cd /tmp; pwd; ls; echo $BASH_SUBSHELL
    • 明确开启子shell运行的命令
      • (cd ~; pwd; ls; cd /tmp; pwd; ls; echo $BASH_SUBSHELL)

6.内置命令 vs 外置命令

  • 什么是内置命令,什么是外置命令?
    • 内置命令:在系统启动时就加载入内存,常驻内存,执行效率更高,但是占用资源
      • 内置命令和shell是为一体的,是shell的一部分,不需要单独去读取某个文件,系统启动后,就执行在内存中了
      • 特点:不会产生子进程去执行
    • 外置命令:系统需要从硬盘中读取程序文件,再读入内存加载
      • 自己单独下载的文件系统命令,处于bash shell之外的程序
      • 特点:一定会开启子进程执行

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

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

相关文章

148. 排序链表

https://leetcode.cn/problems/sort-list/description/https://leetcode.cn/problems/sort-list/description/ 解题思路: 归并排序,先拿到链表长度,每次遍历到一半,进行分割,后序双指针合并。 /*** Definition for sin…

图论---匈牙利算法求二分图最大匹配的实现

开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质: 程序流程图: 数学原理: 求解二分图最大匹配问题的算法,寻找一个边的子集,使得每个左部点都与右部点相连,并且没有两条边共享…

操作系统|day1.了解操作系统

文章目录 了解操作系统定义目的操作系统体系结构功能特征操作系统的区别(64位与32位)操作系统的地址内存管理缓存 了解操作系统 定义 操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件 目的 方便性,有效性(提高系统资源的利用率,提高系统的吞吐量) 操作系统体…

android13 固定U盘链接 SD卡链接 TF卡链接 硬盘链接

1.前言 有些客户使用的应用并不带有自动监听U盘 sd卡广播的代码,使用的代码是固定的地址,这样的话,就需要我们将系统的挂载目录固定了。 原始路径 /storage/3123-19FA 增加链接 /storage/upan_000 -> /storage/3123-19FA 2. 首先如果是应用本身监听的话,使用的是 /…

Linux Mac 安装Higress 平替 Spring Cloud Gateway

Linux Mac 安装Higress 平替 Spring Cloud Gateway Higress是什么?传统网关分类Higress定位下载安装包执行安装命令执行脚本 安装成功打开管理界面使用方法configure.shreset.shstartup.shshutdown.shstatus.shlogs.sh Higress官网 Higress是什么? Higress是基于阿里内部的…

CentOS 8升级gcc版本

1、查看gcc版本 gcc -v发现gcc版本为8.x.x,而跑某个项目的finetune需要gcc-9,之前搜索过很多更新gcc版本的方式,例如https://blog.csdn.net/xunye_dream/article/details/108918316?spm1001.2014.3001.5506,但执行指令 sudo yu…

S32V234平台开发(一)快速使用

快速使用 准备供电复位选择串口通信启动选择显示登陆系统 准备供电 s32v234可以使用两种电源供电 一种是左边电源端子,一种是右边电源适配器(12V 3A) 注意:不要同时使用两种电源同时供电 复位选择 Pressing POR RESET pulls active low EXT_POR signal on S32V2…

使用bypy丝滑传递百度网盘-服务器文件

前言 还在为百度网盘的数据集难以给服务器做同步而痛苦吗,bypy来拯救你了!bypy是一个强大而灵活的百度网盘命令行客户端工具。它是基于Python开发的开源项目,为用户提供了一种通过命令行界面与百度网盘进行交互的方式。使用bypy,…

自动驾驶AVM环视算法--540度全景的算法实现和exe测试demo

参考:金书世界 540度全景影像是什么 540度全景影像是在360度全景影像基础上的升级功能,它增加了更多的摄像头来收集周围的图像数据。通常,这些摄像头分布在车辆的更多位置,例如车顶、车底等,以便更全面地捕捉车辆周围…

C++ | Leetcode C++题解之第226题翻转二叉树

题目: 题解: class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root nullptr) {return nullptr;}TreeNode* left invertTree(root->left);TreeNode* right invertTree(root->right);root->left right;root->right …

内网信息收集:手动、脚本和工具查IP、端口

1.手动查IP和端口 2.工具查IP 3.工具查端口 我们在内网中拿下目标机器后,需要进行一系列的信息收集,以下为总结的收集方法 1.手动信息收集: 以下命令在CS执行时命令前须加shell,如:shell ipconfig 1.收集IP网卡: ip…

【UE5.3】笔记9

1、如何将BSP笔刷转换为静态网格体? 在笔刷的细节的高级里面找到创建静态网格体; 2、如何将自己创建的一个由多个网格体或其他组件组合成的道具转换为个整体即蓝图类?---即把多个Actor转换成蓝图类 选中所要整合的对象,要全选中…

基于Spring Boot的旅游信息推荐信息系统设计与实现(源码+lw+部署+讲解)

技术指标 开发语言:Java 框架:Spring BootJSP JDK版本:JDK1.8 数据库:MySQL5.7 数据库工具:Navicat16 开发软件:IDEA Maven包:Maven3.6.3 浏览器:IE浏览器 功能描述 旅游信…

压缩感知3——重构算法正交匹配追踪算法

算法流程 问题的实质是&#xff1a;AX Y 求解&#xff08;A是M维&#xff0c;Y是N维且N>>M并且稀疏度K<M&#xff09;明显X有无穷多解&#xff0c;重构过程是M次采样得到的采样值升维的过程。OMP算法的具体步骤&#xff1a;(1)用X表示信号&#xff0c;初始化残差e0 …

bash: redi-cli: 未找到命令...

问题描述 在执行命令&#xff1a;redi-cli --bigkeys 提示&#xff1a;bash: redi-cli: 未找到命令... 确定服务器是否有Redis进程 ps -ef | grep redis查找Redis 文件信息 find / -name "redis-*"进入到当前目录 cd /usr/bin/再次执行命令 涉及redis-cli 连…

GOJS去除水印

GOJS gojs 去除水印 **查找go.js库搜索下面这段文本 String.fromCharCode(a.charCodeAt(g)^b[(b[c]b[d])%256]) 加入这段文本 if(f.indexOf(GoJS 2.1 evaluation)>-1|| f.indexOf(© 1998-2021 Northwoods Software)>-1|| f.indexOf(Not for distribution or produ…

最新知识付费系统3.0整站+自动采集同步插件

支持分类替换 将主站同步过来的文章分类进行替换 支持自定义文章作者&#xff08;选择多个作者则同步到的文章作者将会随机分配&#xff09; 支持添加黑名单分类 添加后 如果同步过来的文章包含黑名单分类将不会发布文章 自动检测同步&#xff0c;无需人工值守以及挂采集软件…

Ensp配置防火墙的web界面

Ensp配置防火墙的web界面 准备工作新建网卡配置网卡 启动防火墙配置防火墙注意事项和错误如果云里面没有网卡选项防火墙启动不了没有web界面启动不了没有web界面 准备工作 新建网卡 我用的是win10系统&#xff0c;新建网卡 先右键管理 再点击设备管理器 --- 再网络适配器 接…

Vue核心 — Vue2响应式原理和核心源码解析(核心中的核心)

一、前置知识 1、Vue 核心概念 Vue 是什么? Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。 Vue 核心特点是什么? 响应式数据绑定:…

5.更多

发现一个项目与 MkDocs 类似的项目 PyMdown 拓展文档 &#xff0c;等待探索。 1.排版模仿 以下网站使用 MkDocs 构建 Material for MkDocs 的美化 - Charles Les Notebook (charleschile.com) Documentation - Home Assistant (home-assistant.io) Godot Docs – master bra…