Linux工作原理11 Shell腳本

来源:https://www.cnblogs.com/testing-/p/18326798
-Advertisement-
Play Games

本節內容 因為risc-v存在硬體特權級機制,我們又要實現一個可以使得應用程式工作在用戶級,使得操作系統工作在特權級.原因是要保證用戶態的應用程式不能隨意使用內核態的指令,要使用內核態的指令就必須通過操作系統來執行,這樣有了操作系統的控制和檢查,程式不會因為應用程式的問題導致整個操作系統都運行錯誤. ...


11 shell腳本

如果你能在 shell 中輸入命令,你就能編寫 shell 腳本。shell 腳本(也稱為 Bourne shell 腳本)是寫在文件中的一系列命令;shell 會從文件中讀取這些命令,就像在終端中輸入命令一樣。

11.1 shell腳本基礎

Bourne shell 腳本一般以下麵一行開始,表示 /bin/sh 程式應執行腳本文件中的命令。(確保腳本文件開頭沒有空白)。

#!/bin/sh

在本書的其他腳本中,你會看到#!你可以在#/bin/sh行後列出任何希望shell執行的命令。例如

#!/bin/sh
#
# Print something, then run ls

echo About to run the ls command.
ls

shell 會忽略 # 字元之後一行的任何內容。使用註釋來解釋腳本中其他人閱讀代碼時可能難以理解的部分,或在日後重溫代碼時喚起自己的記憶。

與 Unix 系統上的任何程式一樣,您需要為 shell 腳本文件設置可執行位,但同時也必須設置讀取位,以便 shell 能夠讀取文件。最簡單的方法如下:

$ chmod +rx script

這條 chmod 命令允許其他用戶讀取和執行腳本。如果不想這樣,請使用絕對模式 700(有關許可權的複習,請參閱第 2.17 節)。

創建 shell 腳本並設置讀取和執行許可權後,可以將腳本文件放在命令路徑中的某個目錄下,然後在命令行上運行腳本名稱即可。如果腳本位於當前工作目錄中,也可以運行 ./script,或者使用完整路徑名。

例如,運行名為 myscript 的腳本會導致內核運行 /bin/sh myscript。

瞭解了基礎知識後,讓我們來看看 shell 腳本的一些限制。

Shebang,也稱為 Hashbang 或 Hash-bang,是一種特殊的語法,通常出現在文本文件的第一行的前兩個字元:#!。它的作用是指定腳本應該由哪個解釋器來執行。用途如下:

  • 明確指定解釋器: 不同的腳本語言有不同的解釋器(比如 Bash、Python、Perl 等)。Shebang 告訴操作系統,應該使用哪個解釋器來運行這個腳本,避免了歧義。
  • 直接執行腳本: 有了 Shebang,你就可以直接運行腳本文件,而不需要每次都指定解釋器。
  • 跨平臺相容性: 不同的系統可能預設的 shell 或解釋器不同,Shebang 確保了腳本在不同系統上的可移植性。

Shebang 不一定是 #!/bin/sh;它可以構建為運行系統中任何接受腳本輸入的程式,例如 #!/usr/bin/python,以運行 Python 程式。此外,你可能會遇到包含 /usr/bin/env 的不同模式的腳本。例如,你可能會在第一行看到類似 #!/usr/bin/env python 的內容。這會指示env工具運行 python。這樣做的原因很簡單:env 會在當前的命令路徑中查找要運行的命令,因此不需要為可執行文件指定一個標準位置。缺點是命令路徑中第一個匹配的可執行文件可能不是你想要的。

11.1.1 Shell 腳本的局限性

Bourne shell 可以相對輕鬆地操作命令和文件。在第 2.14 節中,我們瞭解了 shell 重定向輸出的方法,這也是 shell 腳本編程的重要元素之一。然而,shell 腳本只是 Unix 編程的一種工具,雖然腳本具有相當強大的功能,但也有其局限性。

shell 腳本的主要優勢之一是可以簡化和自動執行原本可以在 shell 提示符下執行的任務,例如處理成批文件。但是,如果你想剔除字元串、執行重覆的算術計算或訪問複雜的資料庫,或者如果你想使用函數和複雜的控制結構,你最好使用 Python或awk這樣的腳本語言,甚至可能使用 C 這樣的編譯語言(這一點很重要,所以你會在本章中看到)。

最後,要註意 shell 腳本的大小。shell 腳本要簡短。Bourne shell 腳本並不意味著要很大,儘管你無疑會遇到一些龐然大物。

11.2 引用和字面量

在使用 shell 和腳本的過程中,最令人困惑的一點就是不知道什麼時候以及為什麼要使用引號(quotes)和其他標點符號。假設您想列印 $100 字元串,請執行以下操作:

$ echo $100
00
$ echo "$100"
00
$ echo '$100'
$100

11.2.1 字面量

當你使用引號時,通常是要創建一個字面形式,即 shell 在將其傳遞到命令行之前不應分析(或試圖更改)的字元串。除了剛纔例子中的 $ 之外,當你想將 * 字元傳遞給 grep 等命令而不是讓 shell 展開它,以及當你需要在命令中使用分號 (

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是MCUXpresso IDE下線上聯合調試i.MXRT1170雙核工程的三種方法。 兩年前痞子衡寫過一篇《i.MXRT1170下線上聯合調試雙核工程的三種方法(IAR篇)》,那篇文章詳細介紹了 IAR 下調試 RT1170 雙核工程的幾 ...
  • 本章將和大家分享Linux系統中常用的文件查看命令。廢話不多說,下麵我們直接進入主題。 一、cat命令 1、文件處理 cat命令連接文件並列印到標準輸出設備上,cat經常用來顯示文件的內容,類似於下的type命令。 註意:當文件較大時,文本在屏幕上迅速閃過(滾屏),用戶往往看不清所顯示的內容。因此, ...
  • 單細胞分析上游fasta文件處理 ——基於cellranger與dropseqRunner ###如果測序文件由10X genomics平臺產生,則採用cellranger count的基本流程進行fasta文件的上游處理;如果測序文件由dropseq平臺產生,則採用dropseqRunner軟體進 ...
  • 背景 今天在做項目的時候,總感覺運行不是很流暢,難道本地伺服器也有網路問題?一通操作下來,不出意外,沒解決。說來也巧,無意間的一瞥,竟讓我發現了問題所在——CPU 滿了。這就很不正常了,也沒運行什麼東西呀,不可能就這麼滿了。於是我就開始上網搜索,這是什麼原因導致的(這就是沒完成工作任務的理由?),功 ...
  • 第十五章 按鍵中斷實驗 1)實驗平臺:正點原子DNK210開發板 2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0 3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套實驗源碼+手冊+視頻下載地址:htt ...
  • 使用場景: 文件數量統計,在科研場景中,更多是用於檢驗、核對數據集的樣本數量,防止數據遺漏等意外情況。 常用命令: ls -l | grep "^-" | wc -l 作用:統計當前目錄下,文件的個數(不包括目錄/文件夾) ls -lR | grep "^-" | wc -l 作用:統計當前目錄下, ...
  • 本章將和大家分享Linux系統中的Vim編輯器。廢話不多說,下麵我們直接進入主題。 一、Vim 入門幫助 Vim 帶有完整的幫助文檔:進入 Vim 後輸入“:help”即可訪問 二、Vim 模式介紹 與大部分其它編輯器不同,進入 Vim 後,預設狀態下鍵入的字元並不會插入到所編輯的文件之中。Vim ...
  • SPI是嵌入式中使用比較廣泛的協議之一,本文從該協議的原理入手對其進行了詳細介紹,並結合STM32F103ZET主控晶元對其進行了說明,最後給出了兩個實例代碼demo供大家做參考。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...