[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之外的程序
      • 特点:一定会开启子进程执行

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

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

相关文章

深度学习pytorch多机多卡网络配置桥接方法

1 安装pdsh(Parallel Distributed Shell) sudo apt install pdsh sudo -s # 切换超级用户身份 …

C++ | Leetcode C++题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack { public:queue<int> q;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {int n q.size();q.push(x);for (int i 0; i < n; i) {q.push(q.front());…

pnpm workspace使用教程【Monorepo项目】

目录 前言一、pnpm简介特点&#xff1a;对比 二、 创建项目添加文件 pnpm-workspace.yaml目录结构pnpm workspace: 协议修改配置文件执行 安装 三、命令解析执行包命令所有包操作命令 四、实例代码 前言 前面两篇&#xff0c;我们讲了 yarn workspace 和 lerna &#xff0c; …

Ubuntu 24.04 LTS (Linux) 安装二维码生成工具 QRencode 二维码生成和识别

1 Ubuntu 安装 sudo apt update sudo apt-get install qrencode 2 查看版本 qrencode -V 3 生成二维码 qrencode -o test.png http://www.baidu.com 可以下载test.png图片,用手机浏览器扫描下看(⊙﹏⊙)

Spring Cloud LoadBalancer 入门与实战

一、什么是 LoadBalancer? LoadBalancer(负载均衡器) 是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载&#xff08;请求&#xff09;到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和新能。 1.1 负载均衡分类 负载均衡…

Redis 实现高并发库存扣减方案

背景 公司的电商系统下单 操作库存是一个频繁操作&#xff0c;需要高效地扣减库存&#xff0c;把对销售库存的操作抽出来独立设计一个库存中心系统。 功能包括库存的批量添加、获取、下单、支付、回退等的操作。 解决的业务痛点 需要高效不超卖 方案 一、使用msql乐观锁 …

JAVA之开发神器——IntelliJ IDEA的下载与安装

一、IDEA是什么&#xff1f; IEAD是JetBrains公司开发的专用于java开发的一款集成开发环境。由于其功能强大且符合人体工程学&#xff08;就是更懂你&#xff09;的优点&#xff0c;深受java开发人员的喜爱。目前在java开发工具中占比3/4。如果你要走java开发方向&#xff0c;那…

几种不同的方式禁止IP访问网站(PHP、Nginx、Apache设置方法)

1、PHP禁止IP和IP段访问 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.1.4");if ( in_array( getenv("REMOTE_ADDR"), $banned_ip ) ){die ("您的IP禁止访问&#xff01;");}//禁止某个IP段…

FTP与TFTP

1、TFTP&#xff08;简单文件传输协议&#xff09; TFTP是TCP/IP协议族中一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。 基于UDP协议 端口号&#xff1a;69 特点&#xff1a;简单、轻量级、易于实现 传输过程&…

对象存储-MinIO-学习-01-安装部署

目录 一、介绍 二、环境信息 三、下载安装包 1、MinIO官网下载地址 2、选择版本 &#xff08;1&#xff09;MinIO Server &#xff08;2&#xff09;MinIO Client &#xff08;3&#xff09;MinIO SDK 四、MinIO SDK安装步骤 1、安装minio库 2、导入minio库报错&…

知识图谱入门笔记

自学参考&#xff1a; 视频&#xff1a;斯坦福CS520 | 知识图谱 最全知识图谱综述 详解知识图谱的构建全流程 知识图谱构建&#xff08;概念&#xff0c;工具&#xff0c;实例调研&#xff09; 一、基本概念 知识图谱&#xff08;Knowledge graph&#xff09;&#xff1a;由结…

基于单片机的温控光控智能窗帘设计探讨

摘 要&#xff1a; 文章使用的核心原件是 AT89C52 单片机&#xff0c;以此为基础进行模块化的设计&#xff0c;在整个设计中通过加入光检测模块和温度检测模块&#xff0c;从而对室内的温度和光照强度进行检测&#xff0c;然后将检测得到的数据传输给单片机&#xff0c;单片机…

【目标跟踪】CoTracker 环境配置

配置 CoTracker 环境 首先下载 conda&#xff0c;然后安装虚拟环境。 1.创建环境&#xff1a;如果环境不存在&#xff0c;你需要创建一个新的 conda 环境。可以使用以下命令创建名为 cotracker 的环境&#xff1a; conda create -n cotracker python3.x 其中 3.x 是你想要安…

coze搭建工作流和Agent

coze搭建工作流和Agent Agent LLM 记忆感知规划使用工具 LLM是大语言模型&#xff0c;prompt提示词影响LLM的输出质量 描述需求——>背景——>解决思路&#xff0c;提示词文档。 当有明确的需求和实现需求的路径时&#xff0c;可以通过搭建工作流来完成标准化任务为…

JVM内存泄露的ThreadLocal详解

目录 一、为什么要有ThreadLocal 二、ThreadLocal的使用 三、实现解析 实现分析 具体实现 Hash冲突的解决 开放定址法 链地址法 再哈希法 建立公共溢出区 四、引发的内存泄漏分析 内存泄漏的现象 分析 总结 错误使用ThreadLocal导致线程不安全 一、为什么要有Thr…

【JavaEE】 简单认识CPU

&#x1f435;本篇文章将对cpu的相关知识进行讲解 一、认识CPU 下图是简略的冯诺依曼体系结构图 上图中&#xff0c;存储器用来存储数据&#xff0c;注意在存储器中都是以二进制的形式存储数据的&#xff0c;CPU就是中央处理器&#xff0c;其功能主要是进行各种算术运算和各种…

Java版Flink使用指南——分流导出

大纲 新建工程编码Pom.xml自定义无界流分流 测试工程代码 在之前的案例中&#xff0c;我们一直使用的是单个Sink来做数据的输出。实际上&#xff0c;Flink是支持多个输出流的。本文我们就来讲解如何在Flink数据输出时做分流处理。 我们将基于《Java版Flink使用指南——自定义无…

公司内部配置GitLab,通过SSH密钥来实现免密clone、push等操作

公司内部配置GitLab&#xff0c;通过SSH密钥来实现免密clone、push等操作。以下是配置SSH密钥以实现免密更新的步骤&#xff1a; 1.生成SSH密钥 在本地计算机上打开终端或命令提示符。输入以下命令以生成一个新的SSH密钥&#xff1a;ssh-keygen -t rsa -b 4096 -C "your…

自动驾驶事故频发,安全痛点在哪里?

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;武汉城市留言板上出现了多条关于萝卜快跑的投诉&#xff0c;多名市民反映萝卜快跑出现无故停在马路中间、高架上占最左道低速行驶、转弯卡着不动等情况&#xff0c;导致早晚高峰时段出现拥堵。萝卜快跑是百度 A…

Mac VSCode 突然闪退、崩溃、打不开了

1、 思路历程 VSCode 作为前端常用开发工具&#xff0c;其重要性就不一一描述了。 所以 VSCode 突然打不开了&#xff0c;真的是让我一脸懵逼。 本来以为问题不大&#xff0c;于是 &#xff1a; 1、重启了一下VSCode 2、关机重启了一下电脑&#xff1b; 3、清理了一下缓存&am…