Shell編程核心符號與格式化操作詳解

Shell編程作為Linux系統管理和自動化運維的核心技能,掌握其常用符號和格式化操作是提升腳本開發效率的關鍵。本文將深入解析Shell中重定向、管道符、EOF、輸入輸出格式化等核心概念,并通過豐富的實踐案例幫助讀者掌握這些重要技能。

一、信息傳遞與重定向操作

在Shell腳本中,信息的傳遞和重定向是最基礎也最常用的操作,它們讓命令之間能夠高效地交互數據,并將結果保存到指定位置。

重定向符號詳解

重定向操作主要分為覆蓋式和追加式兩種,每種類型都有其特定的使用場景:

  • 覆蓋式重定向:使用><符號,會將目標文件的原有內容清空后再寫入新內容
  • 追加式重定向:使用>><<符號,會在目標文件的末尾添加新內容而不影響原有數據

下面是一個完整的重定向操作演示:

# 查看原始文件內容
[root@localhost ~]# cat message.txt
Hello World!# 覆蓋式重定向:清空文件并寫入新內容
[root@localhost ~]# echo "New Content" > message.txt
[root@localhost ~]# cat message.txt
New Content# 追加式重定向:在文件末尾添加內容
[root@localhost ~]# echo "Appended Line" >> message.txt
[root@localhost ~]# cat message.txt
New Content
Appended Line

管道符的強大作用

管道符|是Shell中實現命令間數據傳遞的重要機制,它可以將前一個命令的輸出作為后一個命令的輸入,形成強大的命令組合:

# 查找系統中所有包含"httpd"的進程
[root@localhost ~]# ps aux | grep httpd# 統計當前目錄下文件數量
[root@localhost ~]# ls -la | wc -l# 過濾環境變量中包含"PATH"的項
[root@localhost ~]# env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

二、終端輸出控制與后臺執行

在Shell腳本執行過程中,合理控制輸出和執行方式可以提升腳本的使用體驗和效率。

后臺執行與作業控制

使用&符號可以將命令放到后臺執行,避免前臺阻塞:

# 前臺執行長時間運行的命令會阻塞終端
[root@localhost ~]# sleep 10
# 終端會等待10秒后才返回# 后臺執行命令,終端立即返回
[root@localhost ~]# sleep 10 &
[1] 12345# 查看后臺作業
[root@localhost ~]# jobs
[1]+  Running                 sleep 10 &# 終止后臺作業
[root@localhost ~]# kill %1

輸出信息分類與重定向

Shell將輸出信息分為三類:

  • 1:標準正確輸出
  • 2:標準錯誤輸出
  • &:所有輸出

下面是一個完整的輸出重定向案例:

# 創建測試腳本
[root@localhost ~]# cat test.sh
#!/bin/bash
echo "這是正確輸出"
non_existent_command  # 這是一個錯誤命令
echo "另一條正確輸出"# 執行腳本并分別重定向正確和錯誤輸出
[root@localhost ~]# ./test.sh 1>correct.txt 2>error.txt# 查看重定向結果
[root@localhost ~]# cat correct.txt
這是正確輸出
另一條正確輸出[root@localhost ~]# cat error.txt
test.sh:行3: non_existent_command: 未找到命令

三、EOF與文本輸入格式化

在Shell腳本中,處理多行文本輸入和格式化內容是常見需求,EOF機制為此提供了優雅的解決方案。

EOF原理與使用場景

EOF(End Of File)是一種分界符機制,用于標記多行輸入的開始和結束:

# 直接在終端使用EOF輸入多行內容
[root@localhost ~]# cat << EOF
> 這是一個多行文本
> 可以包含任意格式
> 包括空格和縮進
> EOF# 將EOF內容寫入文件
[root@localhost ~]# cat > config.txt << EOF
> server {
>     listen 80;
>     server_name example.com;
>     location / {
>         proxy_pass http://backend;
>     }
> }
> EOF

EOF的高級用法

EOF機制支持自定義分界符和縮進處理:

# 使用自定義分界符
[root@localhost ~]# cat << MARKER
> 這是使用MARKER作為分界符的內容
> 可以包含任何文本
> MARKER# 處理縮進的EOF(使用<<-)
[root@localhost ~]# cat <<- EOF
>     這是一個縮進的文本
>     縮進會被自動去除
> EOF

四、輸入輸出格式化技巧

echo命令的高級用法

echo命令不僅可以輸出文本,還支持豐富的格式化選項:

# 輸出帶顏色的文本
echo -e "\033[31m紅色文本\033[0m"
echo -e "\033[32m綠色文本\033[0m"
echo -e "\033[33m黃色文本\033[0m"# 輸出帶背景色的文本
echo -e "\033[41;37m紅底白字\033[0m"
echo -e "\033[42;37m綠底白字\033[0m"# 輸出帶格式的文本(下劃線、加粗)
echo -e "\033[4m下劃線文本\033[0m"
echo -e "\033[1m加粗文本\033[0m"

printf的強大格式化能力

printf命令提供了類似C語言的格式化輸出功能,支持更復雜的格式控制:

# 基本格式化輸出
printf "姓名: %s, 年齡: %d\n" "張三" 25# 數字格式化(保留兩位小數)
printf "價格: %.2f\n" 19.995# 字段寬度控制
printf "|%10s|%10s|\n" "姓名" "年齡"
printf "|%10s|%10d|\n" "張三" 25
printf "|%10s|%10d|\n" "李四" 30# 數字填充
printf "編號: %05d\n" 123

五、實戰案例:自動部署腳本

下面是一個綜合運用上述知識的Java環境自動部署腳本:

#!/bin/bash
# Java環境自動部署腳本
# 版本:v1.0
# 作者:doubao
# 日期:2025-06-06# 定義顏色變量
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
RESET="\033[0m"# 定義安裝路徑和軟件包
SOFTWARE_DIR="/data/softs"
INSTALL_DIR="/data/server"
JAVA_PACKAGE="jdk-8u301-linux-x64.tar.gz"
JAVA_DIR="jdk1.8.0_301"
JAVA_LINK="java"# 輸出歡迎信息
echo -e "${GREEN}====================================${RESET}"
echo -e "${GREEN}       Java環境自動部署腳本         ${RESET}"
echo -e "${GREEN}====================================${RESET}"
echo -e "${YELLOW}即將開始安裝Java環境,請確認以下信息:${RESET}"
echo -e "軟件包路徑: ${SOFTWARE_DIR}/${JAVA_PACKAGE}"
echo -e "安裝目錄: ${INSTALL_DIR}"
echo -e "${YELLOW}====================================${RESET}"# 確認是否繼續安裝
read -p "是否繼續安裝? (y/n): " CONFIRM
if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; thenecho -e "${RED}安裝已取消${RESET}"exit 1
fi# 檢查軟件包是否存在
if [ ! -f "$SOFTWARE_DIR/$JAVA_PACKAGE" ]; thenecho -e "${RED}錯誤: 軟件包 $SOFTWARE_DIR/$JAVA_PACKAGE 不存在${RESET}"exit 1
fi# 創建安裝目錄
mkdir -p "$INSTALL_DIR"
echo -e "${GREEN}已創建安裝目錄: $INSTALL_DIR${RESET}"# 解壓軟件包
echo -e "${YELLOW}正在解壓軟件包...${RESET}"
tar -xzf "$SOFTWARE_DIR/$JAVA_PACKAGE" -C "$INSTALL_DIR"
echo -e "${GREEN}軟件包解壓完成${RESET}"# 創建符號鏈接
ln -sf "$INSTALL_DIR/$JAVA_DIR" "$INSTALL_DIR/$JAVA_LINK"
echo -e "${GREEN}已創建符號鏈接: $INSTALL_DIR/$JAVA_LINK${RESET}"# 配置環境變量
echo -e "${YELLOW}正在配置環境變量...${RESET}"
cat > /etc/profile.d/java.sh << EOF
export JAVA_HOME=$INSTALL_DIR/$JAVA_LINK
export PATH=\$JAVA_HOME/bin:\$PATH
EOF# 生效環境變量
source /etc/profile.d/java.sh
echo -e "${GREEN}環境變量配置完成${RESET}"# 檢查安裝結果
echo -e "${YELLOW}正在檢查Java安裝...${RESET}"
java -version 2>&1 | tee /tmp/java_install.log
JAVA_VERSION=$(grep "version" /tmp/java_install.log | awk -F\" '{print $2}')# 輸出安裝結果
echo -e "${GREEN}====================================${RESET}"
echo -e "${GREEN}         安裝結果總結           ${RESET}"
echo -e "${GREEN}====================================${RESET}"
echo -e "Java安裝目錄: ${INSTALL_DIR}/${JAVA_LINK}"
echo -e "Java版本: ${GREEN}$JAVA_VERSION${RESET}"
echo -e "${GREEN}====================================${RESET}"
echo -e "${GREEN}Java環境安裝成功!${RESET}"

總結

Shell編程中的符號和格式化操作是提升腳本質量和效率的關鍵。本文詳細介紹了重定向、管道符、EOF、輸入輸出格式化等核心概念,并通過豐富的案例展示了它們的實際應用。掌握這些技能后,你將能夠編寫更專業、更高效的Shell腳本,輕松應對各種系統管理和自動化運維任務。

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

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

相關文章

C++課設:簡易科學計算器(支持+-*/、sin、cos、tan、log等科學函數)

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 專欄介紹&#xff1a;《編程項目實戰》 目錄 一、項目概覽與設計理念1. 功能特色2. 技…

WPF八大法則:告別模態窗口卡頓

?? 核心問題&#xff1a;阻塞式模態窗口的缺陷 原始代碼中ShowDialog()會阻塞UI線程&#xff0c;導致后續邏輯無法執行&#xff1a; var result modalWindow.ShowDialog(); // 線程阻塞 ProcessResult(result); // 必須等待窗口關閉根本問題&#xff1a…

UOS無法安裝deb軟件包

UOS無法安裝deb軟件包 問題描述解決辦法: 關閉安全中心的應用隔離結果驗證 問題描述 UOS安裝Linux微信的deb包時&#xff0c;無法正常安裝 解決辦法: 關閉安全中心的應用隔離 要關閉-安全中心的應用隔離后才可以正常軟件和運行。 應用安全----》 允許任意應用。 結果驗證 # …

鴻蒙jsonToArkTS_工具exe版本來了

前言導讀 相信大家在學習鴻蒙開發過程中最痛苦的就是編寫model 類 特別是那種復雜的json的時候對不對&#xff0c; 這時候有一個自動化的工具給你生成model是不是很開心。我們今天要分享的就是這個工具 JsonToArkTs 的用法 工具地址 https://gitee.com/qiuyu123/jsontomodel…

【Java算法】八大排序

八大排序算法 目錄 注意&#xff1a;以下排序均屬于內部排序 &#xff08;1&#xff09;插入排序 直接插入排序 改進版本 折半插入排序 希爾排序 &#xff08;2&#xff09;交換排序 冒泡排序 快速排序 &#xff08;3&#xff09;選擇排序 簡單選擇排序 堆排序&…

玩轉Docker | 使用Docker部署Qwerty Learner英語單詞學習網站

玩轉Docker | 使用Docker部署Qwerty Learner英語單詞學習網站 前言一、Qwerty Learner簡介Qwerty Learner 簡介主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署Qwerty Learner服務下載Qwerty Learner鏡像編輯部署文件創建容器檢查容器狀態檢查服務…

Vue3中computed和watch的區別

文章目錄 前言&#x1f50d; 一、computed vs watch? 示例對比1. computed 示例&#xff08;適合模板綁定、衍生數據&#xff09;2. watch 示例&#xff08;副作用&#xff0c;如調用接口&#xff09; &#x1f9e0; 二、源碼實現原理&#xff08;簡化理解&#xff09;1. comp…

C++修煉:C++11(二)

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《題海拾貝》、《C修煉之路》 歡迎點贊&#xff0c;關注&am…

單元測試與QTestLib框架使用

一.單元測試的意義 在軟件開發中&#xff0c;單元測試是指對軟件中最小可測試單元&#xff08;通常是函數、類的方法&#xff09;進行隔離的、可重復的驗證。進行單元測試具有以下重要意義&#xff1a; 1.提升代碼質量與可靠性&#xff1a; 早期錯誤檢測&#xff1a; 在開發…

(附實現代碼)Step-Back 回答回退策略擴大檢索范圍

1. LangChain 少量示例提示模板 在與 LLM 的對話中&#xff0c;提供少量的示例被稱為 少量示例&#xff0c;這是一種簡單但強大的指導生成的方式&#xff0c;在某些情況下可以顯著提高模型性能&#xff08;與之對應的是零樣本&#xff09;&#xff0c;少量示例可以降低 Prompt…

16-Oracle 23 ai-JSON-Relational Duality-知識準備

一直做DBA的小伙伴&#xff0c;是不是對開發相對陌生一些。JSON 關系二元性是 Oracle Database 23ai 中重要的特性&#xff0c;同時帶來的是范式革命。JSON關系二元性解決了數據庫領域的根本矛盾?&#xff0c;結構化數據的嚴謹性與半結構化數據的靈活性之間的矛盾。 JSON Rela…

什么是預訓練?深入解讀大模型AI的“高考集訓”

1. 預訓練的通俗理解&#xff1a;AI的“高考集訓” 我們可以將預訓練&#xff08;Pre-training&#xff09; 形象地理解為大模型AI的“高考集訓”。就像學霸在高考前需要刷五年高考三年模擬一樣&#xff0c;大模型在正式誕生前&#xff0c;也要經歷一場聲勢浩大的“題海戰術”…

思爾芯攜手Andes晶心科技,加速先進RISC-V 芯片開發

在RISC-V生態快速發展和應用場景不斷拓展的背景下&#xff0c;芯片設計正面臨前所未有的復雜度挑戰。近日&#xff0c;RISC-V處理器核領先廠商Andes晶心科技與思爾芯&#xff08;S2C&#xff09;達成重要合作&#xff0c;其雙核單集群AX45MPV處理器已在思爾芯最新一代原型驗證系…

vscode配置lua

官網下載lua得到如下 打開vscode的擴展下載如下三個 打開vscode的此處設置 搜索 executorMap&#xff0c;并添加如下內容

理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合檢索增強生成系統

目錄 理解 RAG_HYBRID_BM25_WEIGHT&#xff1a;打造更智能的混合檢索增強生成系統 一、什么是 Hybrid RAG&#xff1f; 二、什么是 RAG_HYBRID_BM25_WEIGHT&#xff1f; 三、參數設置示例 四、什么時候該調整它&#xff1f; 五、實戰建議 六、總結 理解 RAG_HYBRID_BM25…

Spring Boot 2 中 default-autowire 的使用

Spring Boot 2 中 default-autowire 的使用 在 Spring Boot 2 中&#xff0c;default-autowire 這個來自傳統 XML 配置的概念仍然存在&#xff0c;但它的使用已經大大減少&#xff0c;因為現代 Spring Boot 應用主要使用注解驅動的配置方式。 default-autowire 在 Spring Boo…

Spring Boot + Thymeleaf 防重復提交

在 Spring Boot 與 Thymeleaf 結合的 Web 應用中&#xff0c;防止重復提交可以采用token 機制 客戶端禁用按鈕的方式實現&#xff0c;在高并發場景下&#xff0c;考慮使用 Redis 存儲 token 而非 Session。 第一步&#xff1a;后端實現 Controller public class FormControl…

【20250607接單】Spark + Scala + IntelliJ 項目的開發環境配置從零教學

本教程適用于零基礎、一臺剛裝好 Windows 的全新電腦開始&#xff0c;搭建能運行 Spark Scala IntelliJ 項目的開發環境。以下是超詳細、小白級別逐步教程&#xff0c;從“下載什么”到“點擊哪里”都幫你列清楚。 &#x1f3af; 目標 操作系統&#xff1a;Windows10/11工具…

【ubuntu】虛擬機安裝配置,sh腳本自動化,包含 apt+時間同步+docker+mysql+redis+pgsql

可以說是ubuntu基礎環境搭建合集&#xff0c;個人學習用&#xff0c;使用sh一鍵安裝&#xff0c;避免復制各種命令 流程主要包括 0. 可選擇不同ubuntu版本對應安裝&#xff08;支持 Ubuntu 20.04/22.04/23.04/24.04&#xff09; 1. apt換源aliyun 2. 時間選擇上海時區&#x…

Rust 學習筆記:關于智能指針的練習題

Rust 學習筆記&#xff1a;關于智能指針的練習題 Rust 學習筆記&#xff1a;關于智能指針的練習題問題一問題二問題三問題四問題五問題六問題七問題八問題九問題十問題十一 Rust 學習筆記&#xff1a;關于智能指針的練習題 參考視頻&#xff1a; https://www.bilibili.com/vi…