[Linux][Shell][Shell底子] -- [Shebang][特殊符号][变量][父子Shell]具体 ...

打印 上一主题 下一主题

主题 1891|帖子 1891|积分 5673


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变量是弱范例,无需事先声明变量范例,声明和赋值同时进行
      1. name="SnowK"
      复制代码

  • 变量更换/引用
    1. name="SnowK"
    2. 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是可以嵌套运行的
    1. (cd ~; pwd; ls; cd /tmp; pwd; ls)
    2. (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之外的程序
      • 特点:一定会开启子历程执行




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表