📜  Linux Shell 和 Shell 脚本简介

📅  最后修改于: 2022-05-13 01:56:11.307000             🧑  作者: Mango

Linux Shell 和 Shell 脚本简介

如果您正在使用任何主要操作系统,您将间接与shell交互。如果您正在运行 Ubuntu、Linux Mint 或任何其他 Linux 发行版,则每次使用终端时都在与 shell 交互。在本文中,我将讨论 linux shell 和 shell 脚本,因此在理解 shell 脚本之前,我们必须熟悉以下术语 -

  • 核心
  • 贝壳
  • 终端

      什么是内核

      内核是一个计算机程序,它是计算机操作系统的核心,可以完全控制系统中的一切。它管理 Linux 系统的以下资源 -

      • 文件管理
      • 流程管理
      • 输入输出管理
      • 内存管理
      • 设备管理等
          人们常误认为, Linus Torvalds开发了 Linux OS,但实际上他只负责 Linux 内核的开发。
          完整的 Linux 系统 = 内核 + GNU 系统实用程序和库 + 其他管理脚本 + 安装脚本。

          什么是壳牌



          shell 是一种特殊的用户程序,它为用户提供使用操作系统服务的接口。 Shell 接受来自用户的人类可读命令并将它们转换为内核可以理解的内容。它是一种命令语言解释器,用于执行从输入设备(如键盘)或文件中读取的命令。当用户登录或启动终端时,shell 就会启动。

          linux外壳

          linux外壳


          壳牌大致分为两类——
          • 命令行外壳
          • 图形外壳

          命令行外壳

          用户可以使用命令行界面访问 Shell。提供了一个特殊的程序,在 linux/macOS 中称为终端或在 Windows 操作系统中称为命令提示符,用于输入人类可读的命令,例如“cat”、“ls”等,然后执行。结果然后在终端上显示给用户。 Ubuntu 16.4 系统中的终端如下所示 –

          linux命令行

          linux命令行


          在上面的截图中,带有“-l”选项的“ls”命令被执行。

          它将以长列表格式列出当前工作目录中的所有文件。
          对于初学者来说,使用命令行 shell 有点困难,因为很难记住这么多命令。它非常强大,它允许用户将命令存储在一个文件中并一起执行。这样,任何重复性任务都可以轻松自动化。这些文件在 Windows 中通常称为批处理文件,在 Linux/macOS 系统中称为Shell脚本。

          图形外壳

          图形外壳提供了基于图形用户界面 (GUI) 操作程序的方法,允许进行诸如打开、关闭、移动和调整窗口大小以及在窗口之间切换焦点等操作。 Window OS 或 Ubuntu OS 可以被认为是一个很好的例子,它们为用户提供了与程序交互的 GUI。用户不需要为每个操作都输入命令。Ubuntu 系统中的典型 GUI –

          图形界面外壳

          图形界面外壳

          有几个 shell 可用于 Linux 系统,例如 –

          • BASH (Bourne Again SHell) - 它是 Linux 系统中使用最广泛的 shell。它在 Linux 系统和 macOS 中用作默认登录 shell。它也可以安装在 Windows 操作系统上。
          • CSH (C SHell) – C shell 的语法和用法与 C 编程语言非常相似。
          • KSH (Korn SHell) – Korn Shell 也是 POSIX Shell 标准规范等的基础。

          每个 shell 执行相同的工作,但理解不同的命令并提供不同的内置函数。



          外壳脚本

          通常 shell 是交互式的,这意味着它们接受来自用户的命令作为输入并执行它们。然而有时我们想例行地执行一堆命令,所以我们每次都在终端中输入所有命令。
          由于 shell 也可以将命令作为来自文件的输入,我们可以将这些命令写入文件中,并可以在 shell 中执行它们以避免这种重复性工作。这些文件称为Shell ScriptsShell Programs 。 Shell 脚本类似于 MS-DOS 中的批处理文件。每个 shell 脚本都以.sh文件扩展名保存,例如。脚本文件

          shell 脚本的语法就像任何其他编程语言一样。如果您之前有任何编程语言(如Python、C/C++ 等)的经验,那么上手将非常容易。
          一个 shell 脚本包含以下元素——

          • Shell 关键字——if、else、break 等。
          • Shell 命令——cd、ls、echo、pwd、touch 等。
          • 职能
          • 控制流——if..then..else、case 和 shell 循环等。

          为什么我们需要shell脚本

          编写 shell 脚本的原因有很多——

          • 避免重复性工作和自动化
          • 系统管理员使用 shell 脚本进行日常备份
          • 系统监控
          • 向外壳添加新功能等。

          shell 脚本的优点

          • 命令和语法与直接在命令行中输入的完全相同,因此程序员无需切换到完全不同的语法
          • 编写 shell 脚本要快得多
          • 快速开始
          • 交互式调试等

          shell 脚本的缺点

          • 容易出现代价高昂的错误,一个错误就可以改变可能有害的命令
          • 执行速度慢
          • 语言语法或实现中的设计缺陷
          • 不太适合大型复杂的任务
          • 与其他脚本语言不同,提供最少的数据结构。等等

          使用 Bash Shell 编写 shell 脚本的简单演示

          如果您在终端上工作,那么您将在目录中深入遍历某些内容。然后为了在路径中出现几个目录,我们必须执行如下所示的命令以到达“Python”目录 -

          这很令人沮丧,所以我们为什么不可以有一个实用程序,我们只需键入目录名称,我们就可以直接跳转到该目录,而无需一次又一次地执行“cd ../”命令。将脚本另存为“jump.sh”



          # !/bin/bash
            
          # A simple bash script to move up to desired directory level directly
            
          function jump()
          {
              # original value of Internal Field Separator
              OLDIFS=$IFS
            
              # setting field separator to "/" 
              IFS=/
            
              # converting working path into array of directories in path
              # eg. /my/path/is/like/this
              # into [, my, path, is, like, this]
              path_arr=($PWD)
            
              # setting IFS to original value
              IFS=$OLDIFS
            
              local pos=-1
            
              # ${path_arr[@]} gives all the values in path_arr
              for dir in "${path_arr[@]}"
              do
                  # find the number of directories to move up to
                  # reach at target directory 
                  pos=$[$pos+1]
                  if [ "$1" = "$dir" ];then
            
                      # length of the path_arr
                      dir_in_path=${#path_arr[@]}
            
                      #current working directory
                      cwd=$PWD
                      limit=$[$dir_in_path-$pos-1]
                      for ((i=0; i

          现在我们无法执行我们的 shell 脚本,因为它没有权限。我们必须通过键入以下命令使其可执行 -

        $ chmod -x path/to/our/file/jump.sh
        

        现在为了在每个终端会话中都可用,我们必须把它放在“.bashrc”文件中。
        “.bashrc”是一个 shell 脚本,每当它以交互方式启动时,Bash shell 就会运行它。 .bashrc 文件的目的是提供一个地方,您可以在其中设置变量、函数和别名,定义我们的提示并定义我们想要在打开新终端窗口时使用的其他设置。
        现在打开终端并输入以下命令 -

        $ echo “source ~/path/to/our/file/jump.sh”>> ~/.bashrc
        

        现在打开你的终端并通过输入以下命令来尝试新的“跳转”功能 -

        $ jump dir_name
        

        就像下面的截图 –

        学习 Bash 脚本的资源

        • https://bash.cyberciti.biz/guide/The_bash_shell
        • http://tldp.org/LDP/abs/html/

        参考

        • https://en.wikipedia.org/wiki/Shell_script
        • https://en.wikipedia.org/wiki/Shell_(计算)