Shell 編程基礎入門從認識到實戰

對于剛接觸 Linux 或 Unix 系統的開發者來說,Shell 腳本往往是自動化操作的第一道門檻。它不像 Python 那樣語法簡潔,也不像 Java 那樣有完善的面向對象體系,但卻能以極少的代碼實現強大的系統管理功能。本文將從 Shell 的基本概念講起,帶你一步步掌握腳本編寫的核心基礎,完成從 “手動操作” 到 “自動化腳本” 的跨越。

一、認識 Shell:什么是 Shell,為什么需要它?

簡單來說,Shell 是用戶與操作系統內核之間的 “翻譯官”—— 它接收用戶輸入的命令,傳遞給內核執行,并將結果返回給用戶。我們在終端中輸入的ls、cd、mkdir等命令,都是通過 Shell 解析執行的。

常見的 Shell 類型

不同的操作系統默認搭載的 Shell 可能不同,常見的有:

  • bash:Linux 系統中最常用的 Shell,兼容 sh,支持豐富的擴展功能(如命令補全、歷史記錄);
  • zsh:功能更強大的 Shell,支持更多主題和插件,是很多開發者的個性化選擇;
  • sh:早期的 Bourne Shell,語法簡單但功能有限,現在多被 bash 兼容替代。

在終端中輸入echo $SHELL可以查看當前使用的 Shell,本文將以最通用的bash為例進行講解。

為什么要學 Shell 編程?

想象以下場景:

  • 每天需要手動備份 10 個目錄的日志文件;
  • 批量修改 100 個文件的命名格式;
  • 定期檢查服務器的磁盤使用率并發送告警。

這些重復勞動如果用 Shell 腳本實現自動化,能節省大量時間。Shell 腳本的核心價值在于 “批量執行命令 + 邏輯控制”,它能將一系列命令按順序組織,并通過條件判斷、循環等邏輯實現復雜任務。

二、第一個 Shell 腳本:Hello World 的誕生

編寫 Shell 腳本的流程非常簡單,只需三個步驟:創建文件→編寫代碼→賦予權限并執行。

1. 創建腳本文件

用任意文本編輯器(如 vim、nano)創建一個.sh后綴的文件,例如hello.sh:


vim hello.sh

2. 編寫腳本內容

在文件中輸入以下代碼:


#!/bin/bash# 這是我的第一個Shell腳本echo "Hello, Shell Programming!"

代碼解析:

  • #!/bin/bash:稱為 “shebang”,必須放在腳本第一行,指定腳本由 bash 解釋執行;
  • # 這是注釋:#開頭的行是注釋,用于說明代碼功能,不被執行;
  • echo "...":打印字符串到終端,類似其他語言的print函數。

3. 賦予執行權限并運行

剛創建的腳本默認沒有執行權限,需要用chmod命令賦予:


chmod +x hello.sh # 賦予執行權限

然后執行腳本:


./hello.sh # 輸出:Hello, Shell Programming!

也可以直接通過 bash 命令運行(無需執行權限):


bash hello.sh # 同樣生效

小技巧:如果腳本放在/usr/local/bin等環境變量目錄下,可直接輸入文件名執行(如hello.sh),無需帶路徑。

三、Shell 變量:存儲數據的容器

和其他編程語言一樣,Shell 也需要變量來存儲數據。但與 Python 等語言不同,Shell 變量的定義和使用有其獨特性。

1. 變量的定義與賦值

定義變量的格式為變量名=值,注意等號兩邊不能有空格


name="Alice" # 正確:字符串賦值age=25 # 正確:數字賦值# 錯誤寫法:name = "Bob"(等號兩邊有空格)

2. 變量的使用

使用變量時需在變量名前加$符號,例如:


#!/bin/bashname="Alice"echo "My name is $name" # 輸出:My name is Aliceecho "Age: $age" # 輸出:Age: (未定義的變量會被視為空)

如果變量名與其他字符相鄰,可用大括號{}區分:


echo "Hello, ${name}123" # 輸出:Hello, Alice123(若不加{}會被解析為$name123)

3. 環境變量與局部變量

  • 局部變量:僅在當前腳本或終端中有效,如上面定義的name;
  • 環境變量:全局生效,可被所有子進程訪問,常用的有:
    • $HOME:用戶主目錄(如/home/alice);
    • $PATH:命令搜索路徑(存放可執行命令的目錄);
    • $USER:當前登錄用戶名;
    • $?:上一條命令的退出狀態(0 表示成功,非 0 表示失敗)。

查看環境變量可用echo,例如:


echo $HOME # 輸出:/home/aliceecho $PATH # 輸出:/usr/local/sbin:/usr/local/bin:...

自定義環境變量需用export命令:


export WORK_DIR="/data/project" # 定義環境變量

四、數據類型:字符串與數字的處理

Shell 是弱類型語言,變量默認都按字符串處理,但也支持數字運算。

1. 字符串操作

字符串是 Shell 中最常用的數據類型,支持拼接、截取、替換等操作。

(1)字符串拼接

直接將變量或字符串放在一起即可:


first="Hello"last="World"full="$first $last" # 拼接為"Hello World"echo $full # 輸出:Hello World
(2)字符串長度

用${#變量名}獲取長度:


str="Shell"echo ${#str} # 輸出:5("Shell"有5個字符)
(3)字符串截取

格式:${變量名:起始位置:長度}(起始位置從 0 開始):


path="/home/user/docs/file.txt"# 從第6個字符開始截取(跳過"/home/")echo ${path:6} # 輸出:user/docs/file.txt# 從第6個字符開始,截取4個字符echo ${path:6:4} # 輸出:user
(4)字符串替換
  • 替換第一個匹配項:${變量名/舊字符串/新字符串}
  • 替換所有匹配項:${變量名//舊字符串/新字符串}

示例:


filename="report_2023_v1.txt"# 替換第一個"_"為"-"echo ${filename/_/-} # 輸出:report-2023_v1.txt# 替換所有"_"為"-"echo ${filename//_/-} # 輸出:report-2023-v1.txt

2. 數字運算

Shell 默認將數字視為字符串,需用特殊語法進行運算,常用的有兩種方式:

(1)$((表達式))

適合簡單運算:


a=10b=3echo $((a + b)) # 輸出:13echo $((a * b)) # 輸出:30echo $((a / b)) # 輸出:3(整數除法,向下取整)echo $((a % b)) # 輸出:1(取余數)
(2)expr 命令

注意表達式中運算符兩邊需有空格:


expr 10 + 3 # 輸出:13expr 10 \* 3 # 乘法需加轉義符\(避免被Shell解析)

推薦使用$((...)),語法更簡潔且支持變量直接參與運算。

五、輸入輸出與管道:數據的流轉

Shell 腳本的輸入輸出控制和管道操作,是實現命令協作的核心。

1. 標準輸入輸出

默認情況下:

  • 標準輸入(stdin):從鍵盤接收輸入,文件描述符為 0;
  • 標準輸出(stdout):輸出到終端,文件描述符為 1;
  • 標準錯誤(stderr):錯誤信息輸出到終端,文件描述符為 2。

2. 重定向:改變輸入輸出的方向

通過重定向符號可將輸入輸出指向文件:

  • >:覆蓋寫入文件(如echo "test" > file.txt);
  • >>:追加寫入文件(如echo "test" >> file.txt);
  • <:從文件讀取輸入(如read var < file.txt);
  • 2>:將錯誤信息寫入文件(如ls error_dir 2> err.log);
  • &>:將標準輸出和錯誤都寫入文件(如command &> output.log)。

示例:


# 將命令輸出寫入文件(覆蓋原有內容)ls -l > file_list.txt# 追加輸出到文件echo "新內容" >> file_list.txt# 捕獲錯誤信息rm non_exist_file 2> error.log

3. 管道:命令間的數據傳遞

管道符號|可將前一個命令的輸出作為后一個命令的輸入,實現命令協作:


# 查找包含"error"的日志行,并統計數量cat app.log | grep "error" | wc -l# 列出當前目錄文件,按大小排序(逆序)ls -l | sort -k5,5nr

命令解析:

  • grep "error":篩選包含指定字符串的行;
  • wc -l:統計行數;
  • sort -k5,5nr:按第 5 列(文件大小)逆序(nr)排序。

六、實戰案例:批量文件重命名腳本

掌握了基礎語法后,我們來編寫一個實用腳本:將指定目錄下的所有.txt文件添加前綴(如2023_)。

腳本代碼

?#!/bin/bash# 批量給txt文件添加前綴# 使用方法:./rename_txt.sh 目錄路徑 前綴# 檢查參數是否正確if [ $# -ne 2 ]; thenecho "使用錯誤!正確用法:$0 目錄路徑 前綴"exit 1fidir=$1prefix=$2# 檢查目錄是否存在if [ ! -d "$dir" ]; thenecho "錯誤:目錄 $dir 不存在!"exit 1fi# 切換到目標目錄cd "$dir" || exit 1# 遍歷txt文件并添加前綴for file in *.txt; do# 跳過非文件(如目錄)if [ -f "$file" ]; thennew_name="${prefix}${file}"mv "$file" "$new_name"echo "已重命名:$file → $new_name"fidoneecho "批量重命名完成!"?

代碼解析

  1. $#表示參數個數,$0表示腳本名,$1、$2表示第一個和第二個參數;
  1. [ -d "$dir" ]判斷是否為目錄,[ -f "$file" ]判斷是否為文件(條件判斷語法將在后續文章詳細講解);
  1. for file in *.txt遍歷所有 txt 文件,mv命令執行重命名。

運行效果


# 創建測試文件mkdir test_dirtouch test_dir/{a,b,c}.txt# 執行腳本./rename_txt.sh test_dir 2023_# 輸出結果已重命名:a.txt → 2023_a.txt已重命名:b.txt → 2023_b.txt已重命名:c.txt → 2023_c.txt

批量重命名完成!

七、總結

  • Shell 的作用與常見類型;
  • 腳本的創建、執行流程;
  • 變量定義、數據類型(字符串、數字);
  • 輸入輸出重定向與管道操作;
  • 一個實戰案例(批量重命名文件)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90207.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90207.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90207.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

混合遺傳粒子群算法在光伏系統MPPT中的應用研究

混合遺傳粒子群算法在光伏系統MPPT中的應用研究 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 摘要 本文針對光伏系統最大功率點跟蹤(MPPT)問題&#xff0…

機器視覺的布料絲印應用

在紡織印染行業&#xff0c;布料絲印工藝的精度直接決定產品外觀質量與市場競爭力。傳統絲印設備依賴機械定位與人工校準&#xff0c;面對高密度圖案、柔性面料或復雜紋理時&#xff0c;易出現套色偏移、油墨滲透不均等問題&#xff0c;導致良品率波動與生產成本攀升。 隨著機…

前端常用類庫

常用類庫 類庫作用 類庫可以幫助我們快速實現項目業務的開發與功能的實現, 幫助我們解放勞動力提高生產效率, 前端中的類庫與框架都是由原生javascript編寫, 提供給其他開發者應用于某一業務環境或者需求。一般有開發者/團隊開源維護. 優秀的類庫需要具備高度封裝可用, 穩定, …

通俗易懂循環神經網絡(RNN)指南

本文用直觀類比、圖表和代碼&#xff0c;帶你輕松理解RNN及其變體&#xff08;LSTM、GRU、雙向RNN&#xff09;的原理和應用。什么是循環神經網絡 循環神經網絡&#xff08;Recurrent Neural Network, RNN&#xff09;是一類專門用于處理序列數據的神經網絡。與前饋神經網絡不同…

【SVM】支持向量機實例合集

基于Java的SVM(支持向量機)實例合集 以下是一個基于Java的SVM(支持向量機)實例合集,包含核心代碼示例和應用場景說明。這些例子基于流行的機器學習庫(如LIBSVM、Weka、JSAT)實現。 數據準備與加載 使用LIBSVM格式加載數據集: // 加載LIBSVM格式數據 svm_problem pr…

Python100個庫分享第38個—lxml(爬蟲篇)

目錄專欄導讀&#x1f4da; 庫簡介&#x1f3af; 主要特點&#x1f6e0;? 安裝方法Windows安裝Linux/macOS安裝驗證安裝&#x1f680; 快速入門基本使用流程HTML vs XML解析&#x1f50d; 核心功能詳解1. XPath選擇器2. CSS選擇器支持3. 元素操作&#x1f577;? 實戰爬蟲案例…

imx6ull-系統移植篇17——linux頂層 Makefile(上)

目錄 前言 頂層 Makefile 源碼簡析 版本號 MAKEFLAGS 變量 命令輸出 靜默輸出 設置編譯結果輸出目錄 代碼檢查 模塊編譯 設置目標架構和交叉編譯器 調用 scripts/Kbuild.include 文件 交叉編譯工具變量設置 頭文件路徑變量 導出變量 make xxx_defconfig 過程 …

OpenCV 官翻6 - Computational Photography

文章目錄圖像去噪目標理論OpenCV中的圖像去噪1、cv.fastNlMeansDenoisingColored()2、cv.fastNlMeansDenoisingMulti()附加資源圖像修復目標基礎概念代碼補充資源練習高動態范圍成像&#xff08;HDR&#xff09;目標理論基礎曝光序列HDR1、將曝光圖像加載到列表中2、將曝光序列…

APT32F1732RBT8愛普特微電子 32位MCU國產芯片 智能家居/工業控制 首選

APT32F1732RBT8 愛普特微電子&#xff0c;32位MCU國產芯片一、產品簡介APT32F1732RBT8 是愛普特微電子&#xff08;APT&#xff09;推出的高性能32位ARM Cortex-M0內核MCU&#xff0c;主頻高達48MHz&#xff0c;內置64KB Flash8KB RAM&#xff0c;專為智能家居、工業控制、消費…

Smart Tomcat

本篇博客的內容是教你借助idea中的插件,把tomcat集成到idea中安裝 Smart Tomcat 插件搜索下載 ,如果一直處于加載界面,就嘗試一下科學上網配置 Smart Tomcat 插件 點擊右上角的 "Add Configuration"選擇左側的 "Smart Tomcat" 在 Name 這一欄填寫一個名字(…

Linux_shell編寫

title: Linux_4 shell編寫 shell pwd (/root/A/2025_7/19/myshell) 首先需要設計命令行提示 &#xff08;MakeCommandLine()&#xff09; 首先獲取相關信息 getenv(“name”) // 獲取用戶名 const char* GetUserName() {const char* name getenv("USER");if (name …

【數據結構】棧的深入解析--用C語言實現

文章目錄1.棧的概念2.棧的底層結構3.棧的功能4.棧的實現4.1.棧結構的定義4.2.棧的初始化4.3.棧的銷毀4.4.入棧4.5.出棧4.6.取棧頂元素4.7.獲取棧中有效元素個數5.完整代碼Stack.hStack.cmain.c運行結果1.棧的概念 是一種特殊的線性表&#xff0c;只允許數據在固定的一段進行插…

Git倉庫核心概念與工作流程詳解:從入門到精通

Git倉庫的基本概念版本庫&#xff08;Repository&#xff09;是Git的核心概念&#xff0c;你可以簡單理解為一個被Git管理的目錄。這個目錄里的所有文件都能被Git跟蹤&#xff0c;記錄每次修改和刪除&#xff0c;讓你可以隨時追溯歷史或在未來某個時刻"還原"文件。Gi…

Web開發 05

1 React庫&#xff08;人話詳解版&#xff09;別慌&#xff0c;React 剛接觸時是會有點懵&#xff0c;咱們用 “人話 類比” 一步步拆&#xff1a;核心概念先抓牢組件&#xff08;Component&#xff09;把它想成 “樂高積木”&#xff0c;比如做個社交 App&#xff0c;頂部導航…

RustDesk 自建中繼服務器教程(Mac mini)

&#x1f4d6; 教程目標 在家里的 Mac mini 上部署 RustDesk 中繼服務器 (hbbs hbbr)&#xff0c;讓你從辦公室、筆電或手機 低延遲、安全 地遠程控制家里的 Windows 和 Mac mini。 ? 不依賴第三方服務器 ? 支持 P2P 和中繼雙模式 ? 全流量可控、跨平臺 &#x1f3d7;? 架…

數據庫—修改某字段默認值

前言有時候&#xff0c;數據庫的字段默認值沒有正確設置&#xff0c;這時候需要改默認值。以下是我做的改默認值的記錄&#xff0c;希望對網友有所幫助。1.SQL SERVER下面的示例假設你要修改名為 YourColumnName 的字段&#xff0c;并為其設置一個新的默認值 NewDefaultValue。…

Spring快速整合Mybatis

MyBatis是一個優秀的持久層框架&#xff0c;Spring則是廣泛使用的Java應用框架。可以將兩者整合可以充分發揮各自的優勢。 1、Spring整合MyBatis的基本配置 添加依賴&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spri…

基于深度學習的語音識別:從音頻信號到文本轉錄

前言 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是人工智能領域中一個極具挑戰性和應用前景的研究方向。它通過將語音信號轉換為文本&#xff0c;為人們提供了更加自然和便捷的人機交互方式。近年來&#xff0c;深度學習技術在語音識別領域取得了顯著…

本地部署Nacos開源服務平臺,并簡單操作實現外部訪問,Windows 版本

Nacos 是一款阿里開源的動態服務發現、配置、管理平臺&#xff0c;擁有易于集成、高可用與可擴展等特點。它提供了動態服務注冊和發現能力&#xff0c;使得服務自動注冊到服務器并且消費真能夠發現提供者。本文將詳細介紹如何在本地安裝 Nacos &#xff0c;以及結合nat123端口映…

數據結構:反轉字符串(Reversing a String)

目錄 方法一&#xff1a;雙指針法 方法二&#xff1a;輔助數組 方法對比總結&#xff1a; 問題定義 給定一個字符串&#xff0c;例如&#xff1a; char str[] "hello";我們的目標是把它反轉成&#xff1a; "olleh"&#x1f4cc; 輸入特點&#xff…