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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...