day027-Shell自動化編程-基礎

文章目錄

  • 1. 修改vim配置文件自動添加注釋
  • 2. 故障案例:Windows上寫的Shell腳本上傳到Linux系統上運行報錯
  • 3. 腳本運行方法
  • 4. 變量
    • 4.1 普通變量
    • 4.2 環境變量
    • 4.3 特殊變量
    • 4.4 案例:書寫ping檢查腳本,檢查腳本傳入的第一個參數
    • 4.5 面試題:$n,n大于9后會有什么問題?
  • 5. if判斷
    • 5.1 比較大小
    • 5.2 案例:書寫ping檢查域名/ip的腳本
    • 5.3 案例:檢查指定用戶是否存在
    • 5.4 案例:書寫回收站腳本,執行rm的時候調用mv命令移動指定文件或目錄到/recycle目錄下
  • 6. for循環
    • 6.1 案例:批量添加用戶
    • 6.2 案例:檢查系統中可登錄用戶的uid、gid信息
    • 6.3 批量檢查ip/domain是否可以訪問
  • 7. 思維導圖

1. 修改vim配置文件自動添加注釋

  • vim的配置文件:/etc/vimrc(Kylin),/etc/vim/vimrc(ubuntu)
  • 添加下面配置:
autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash,Dockerfile,docker-compose.yml exec ":call SetTitle()"func SetTitle()  if expand("%:e") =~ 'sh\|bash'  call setline(1,"#!/bin/bash")call setline(2, "##############################################################")  call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")endif  if expand("%") == 'Dockerfile'  call setline(1, "#####################Dockerfile###############################")call setline(2, "##############################################################")  call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")call setline(10, "FROM")call setline(11, "LABEL maintaniner='oldboy  lidao@oldboyedu.com' author=lidao996")call setline(12, "CMD []")endif  if expand("%") == 'docker-compose.yml'  call setline(1, "#####################docker-compose###########################")call setline(2, "##############################################################")  call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")call setline(10, "version: '3.3'")call setline(11, "services:")call setline(12, "volumes:")endif  
endfunc

2. 故障案例:Windows上寫的Shell腳本上傳到Linux系統上運行報錯

  • 原因:Windows下的回車符是\r\n,Linux下的回車符是\n,因此報錯。可以用 cat -n查看詳細內容
  • 解決方法:dos2unix,使用該命令將腳本格式轉換為Linux的格式

3. 腳本運行方法

方法使用場景
bash/sh最常用的方法,ubuntu中不能用sh
路徑運行不推薦使用,因為可能有權限問題導致失敗,需要給腳本執行權限
source/.運行腳本/加載帶有變量、自定義函數庫;
1.加載全局變量配置文件時使用
2.實現include功能,,加載子腳本

4. 變量

4.1 普通變量

變量命令規則:

  • 不能以數字開頭
  • 變量名應有具體含義

4.2 環境變量

  • 全局變量,查看全局變量的命令:env
  • export:創建或修改全局變量

4.3 特殊變量

  • 在腳本中使用
特殊變量說明
$nn是數字,表示第n個腳本參數
$0腳本名字
$#腳本參數個數
$*/$@取出所有腳本參數
$?上一個命令的返回值;0表示正確,非0表示錯誤

4.4 案例:書寫ping檢查腳本,檢查腳本傳入的第一個參數

[root@oldboy99-Kylin /server/scripts]# cat ping.sh 
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################ip=$1ping -c 1 $ip
[root@oldboy99-Kylin /server/scripts]# bash ping.sh jd.com
PING jd.com (211.144.27.126) 56(84) bytes of data.
64 bytes from 211.144.27.126 (211.144.27.126): icmp_seq=1 ttl=128 time=136 ms--- jd.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 136.231/136.231/136.231/0.000 ms

4.5 面試題:$n,n大于9后會有什么問題?

問題現象:

  • $n不能作為整體被解析,需要用大括號使n作為一個整體
[root@oldboy99-Kylin /server/scripts]# cat test.sh 
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################echo $9 $10 $11
[root@oldboy99-Kylin /server/scripts]# bash test.sh {a..z}
i a0 a1

修改后:

[root@oldboy99-Kylin /server/scripts]# cat test.sh
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################echo $9 ${10} ${11}
[root@oldboy99-Kylin /server/scripts]# bash test.sh {a..z}
i j k

5. if判斷

5.1 比較大小

判斷if符號
等于-eq
不等于-ne
大于-gt
大于等于-ge
小于-lt
小于等于-le

5.2 案例:書寫ping檢查域名/ip的腳本

[root@oldboy99-Kylin /server/scripts]# cat ping.sh 
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ip=$1# ping
ping -c2 $ip >/dev/null 2>&1# if
if [ $? -eq 0 ];thenecho "${ip} 可以訪問"
elseecho "${ip} 不能訪問"
fi[root@oldboy99-Kylin /server/scripts]# bash ping.sh jd.com
jd.com 可以訪問

修改版:

[root@oldboy99-Kylin /server/scripts]# cat ping.sh 
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ip=$1# 檢查是否有參數
if [ $# -ne 1 ];thenecho "Usage:$0 ip/domain"exit 1 #退出腳本,返回值是1
fi# ping
ping -c2 $ip >/dev/null 2>&1# if
if [ $? -eq 0 ];thenecho "${ip} 可以訪問"
elseecho "${ip} 不能訪問"
fi[root@oldboy99-Kylin /server/scripts]# bash ping.sh www.qq.com
www.qq.com 可以訪問

5.3 案例:檢查指定用戶是否存在

[root@oldboy99-Kylin /server/scripts]# cat check_user.sh 
#!/bin/bash
##############################################################
# File Name: check_user.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
user=$1# command
# 檢查參數個數
if [ $# -ne 1 ];thenecho "usage: $0 username"exit 1
fiid ${user} >/dev/null 2>&1
if [ $? -eq 0 ];thenecho "${user}用戶存在"
elseecho "${user}用戶不存在"fi[root@oldboy99-Kylin /server/scripts]# bash check_user.sh mysql
mysql用戶不存在

5.4 案例:書寫回收站腳本,執行rm的時候調用mv命令移動指定文件或目錄到/recycle目錄下

  • mktemp:創建臨時文件或目錄
  • -d:創建目錄
  • -p 路徑:指定臨時文件或目錄存放位置
[root@oldboy99-Kylin /server/scripts]# cat recycle.sh 
#!/bin/bash
##############################################################
# File Name: recycle.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
files="$*"
recy_dir="/recycle"# command
# 檢查參數個數
if [ $# -eq 0 ];thenecho "usage: $0 filename"exit 1
fi
# 檢查用戶是否為root
if [ $UID -ne 0 ];thenecho "請使用root刪除,普通用戶請使用mv自行操作"exit 2
fimv ${files} ${recy_dir} >>/dev/null 2>&1if [ $? -eq 0 ];thenecho "刪除成功!"
elseecho "刪除失敗"
fi
[root@oldboy99-Kylin /server/scripts]# mktemp -dp ./
./tmp.KKJkrjumyK
[root@oldboy99-Kylin /server/scripts]# alias |grep rm
alias rm='bash /server/scripts/recycle.sh'
[root@oldboy99-Kylin /server/scripts]# rm ./tmp.KKJkrjumyK/
刪除成功!

6. for循環

6.1 案例:批量添加用戶

[root@oldboy99-Kylin /server/scripts]# for name in oldboy{01..10}; do useradd $name;done
[root@oldboy99-Kylin /server/scripts]# tail /etc/passwd
oldboy01:x:1003:1003::/home/oldboy01:/bin/bash
oldboy02:x:1004:1004::/home/oldboy02:/bin/bash
oldboy03:x:1005:1005::/home/oldboy03:/bin/bash
oldboy04:x:1006:1006::/home/oldboy04:/bin/bash
oldboy05:x:1007:1007::/home/oldboy05:/bin/bash
oldboy06:x:1008:1008::/home/oldboy06:/bin/bash
oldboy07:x:1009:1009::/home/oldboy07:/bin/bash
oldboy08:x:1010:1010::/home/oldboy08:/bin/bash
oldboy09:x:1011:1011::/home/oldboy09:/bin/bash
oldboy10:x:1012:1012::/home/oldboy10:/bin/bash

6.2 案例:檢查系統中可登錄用戶的uid、gid信息

[root@oldboy99-Kylin /server/scripts]# cat check_login.sh
#!/bin/bash
##############################################################
# File Name: check_login.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
export LANG=en_US.UTF-8users=`grep '/bin/bash' /etc/passwd |awk -F ':' '{print $1}'`# for
for name in $users
douid=`id $name |awk -F '[ =]' '{print $2}'`gid=`id $name |awk -F '[ =]' '{print $4}'`group=`id $name |awk -F '[ =]' '{print $6}'`echo "用戶名:$name,用戶id:$uid,用戶組:$gid,用戶組信息:$group"
done
[root@oldboy99-Kylin /server/scripts]# bash check_login.sh
用戶名:root,用戶id:0(root),用戶組:0(root),用戶組信息:0(root)
用戶名:oldboy,用戶id:1000(oldboy),用戶組:1000(oldboy),用戶組信息:1000(oldboy)
用戶名:oldboy01,用戶id:1003(oldboy01),用戶組:1003(oldboy01),用戶組信息:1003(oldboy01)
用戶名:oldboy02,用戶id:1004(oldboy02),用戶組:1004(oldboy02),用戶組信息:1004(oldboy02)
用戶名:oldboy03,用戶id:1005(oldboy03),用戶組:1005(oldboy03),用戶組信息:1005(oldboy03)
用戶名:oldboy04,用戶id:1006(oldboy04),用戶組:1006(oldboy04),用戶組信息:1006(oldboy04)
用戶名:oldboy05,用戶id:1007(oldboy05),用戶組:1007(oldboy05),用戶組信息:1007(oldboy05)
用戶名:oldboy06,用戶id:1008(oldboy06),用戶組:1008(oldboy06),用戶組信息:1008(oldboy06)
用戶名:oldboy07,用戶id:1009(oldboy07),用戶組:1009(oldboy07),用戶組信息:1009(oldboy07)
用戶名:oldboy08,用戶id:1010(oldboy08),用戶組:1010(oldboy08),用戶組信息:1010(oldboy08)
用戶名:oldboy09,用戶id:1011(oldboy09),用戶組:1011(oldboy09),用戶組信息:1011(oldboy09)
用戶名:oldboy10,用戶id:1012(oldboy10),用戶組:1012(oldboy10),用戶組信息:1012(oldboy10)

6.3 批量檢查ip/domain是否可以訪問

[root@oldboy99-Kylin /server/scripts]# cat ping.sh 
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ips=$*# 檢查是否有參數
if [ $# -eq 0 ];thenecho "Usage:$0 ip/domain"exit 1 #退出腳本,返回值是1
fi# ping
for ip in $ips
doping -c2 $ip >/dev/null 2>&1# ifif [ $? -eq 0 ];thenecho "${ip} 可以訪問"elseecho "${ip} 不能訪問"
fi
done
[root@oldboy99-Kylin /server/scripts]# bash ping.sh qq.com baidu.com
qq.com 可以訪問
baidu.com 可以訪問

7. 思維導圖

【金山文檔 | WPS云文檔】 思維導圖 https://kdocs.cn/l/co3I7PtpTYQX

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

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

相關文章

2025年滲透測試面試題總結-騰訊[實習]科恩實驗室-安全工程師(題目+回答)

安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 騰訊[實習]科恩實驗室-安全工程師 一、網絡與協議 1. TCP三次握手 2. SYN掃描原理 3. HTTPS證書機制 二…

人工智能賦能高中學科教學的應用與前景研究

一、引言 1.1 研究背景 在科技飛速發展的當下,人工智能(Artificial Intelligence,簡稱 AI)已成為全球矚目的關鍵技術領域,深刻地改變著人們的生活、工作和學習方式。從智能家居設備到智能交通系統,從醫療…

八、【ESP32開發全棧指南:UDP客戶端】

1. 環境準備 安裝ESP-IDF v4.4 (官方指南)確保Python 3.7 和Git已安裝 2. 創建項目 idf.py create-project udp_client cd udp_client3. 完整優化代碼 (main/main.c) #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&…

Android Studio 解決首次安裝時下載 Gradle 慢問題

1、問題描述 第一次安裝 Android Studio 時&#xff0c; 新建工程后&#xff0c;在編譯時會自動去下載 Gradle&#xff0c;但是一般都會下載失敗&#xff0c;提示鏈接超時&#xff1a; Could not install Gradle distribution from https://services.gradle.org/distributions…

hive聚合函數多行合并

在數據倉庫和大數據處理的場景中&#xff0c;Hive提供了強大的SQL查詢能力&#xff0c;其中包括聚合函數用于處理和合并多行數據。本文將深入探討Hive中的幾種常見聚合函數及其在多行合并中的應用。 一、Hive中的常見聚合函數 Hive提供了多種聚合函數&#xff0c;這些函數可以…

關于物聯網的基礎知識(一)

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于物聯網的基礎知識&#xff08;一&a…

遷移科技3D視覺系統:重塑紙箱拆垛場景的智能革命

一、傳統拆垛場景的困局與破局之道 在汽車零部件倉庫中&#xff0c;每天有超過2萬只異形紙箱需要拆垛分揀。傳統人工拆垛面臨三大挑戰&#xff1a; 效率瓶頸&#xff1a;工人每小時僅能處理200-300件&#xff0c;且存在間歇性疲勞安全隱患&#xff1a;20kg以上重箱搬運導致年…

微軟重磅發布Magentic UI,交互式AI Agent助手實測!

微軟重磅發布Magentic UI,交互式AI Agent助手實測! 何為Magentic UI? Magentic UI 是微軟于5.19重磅發布的開源Agent助手,并于24日剛更新了第二個版本0.04版 從官方的介紹來看,目標是打造一款 以人為中心 的智能助手,其底層由多個不同的智能體系統驅動,能夠實現網頁瀏覽…

Python實現快速排序的三種經典寫法及算法解析

今天想熟悉一下python的基礎寫法&#xff0c;那就從最經典的快速排序來開始吧&#xff1a; 1、經典分治寫法&#xff08;原地排序&#xff09; 時間復雜度&#xff1a;平均O(nlogn)&#xff0c;最壞O(n) 空間復雜度&#xff1a;O(logn)遞歸棧空間 特點&#xff1a;通過左右指針…

海康網絡攝像頭實時取幀轉Opencv數組格式(h,w,3),已實現python、C#

海康攝像頭取幀都是有官方demo的&#xff0c;但是將海康格式的數據轉為Opencv格式的沒有相關demo&#xff0c;而大部分深度學習圖像檢測算法(如YOLO)&#xff0c;都是用opencv格式的圖像作為輸入&#xff0c;因此將海康格式數據轉為opencv格式兼容性更強 需要代碼請私信聯系&a…

職坐標IT教育物聯網全棧開發實戰:傳感器到云平臺全鏈路

物聯網全棧開發涉及從終端感知到云端服務的全流程技術整合&#xff0c;其核心在于構建完整的“端-管-云-用”技術鏈條。為幫助開發者系統掌握這一能力&#xff0c;課程圍繞四大模塊展開&#xff1a;傳感器數據采集與處理、通信協議適配與優化、云平臺架構設計及跨平臺應用開發。…

LUFFY(路飛): 使用DeepSeek指導Qwen強化學習

論文標題 Learning to Reason under Off-Policy Guidance 論文地址 https://arxiv.org/pdf/2504.14945 代碼地址 https://github.com/ElliottYan/LUFFY 作者背景 上海人工智能實驗室&#xff0c;西湖大學&#xff0c;南京大學&#xff0c;香港中文大學 動機 目前大模型…

Android Camera Hal中通過Neon指令優化數據拷貝

背景描述&#xff1a; Camera apk普通相機模式錄像操作時&#xff0c;一般是同時請求兩個流&#xff0c;即預覽流和錄像流。對于兩個流輸出圖像格式和分辨率相同的情況下&#xff0c;是不是可以通過一個流拷貝得到另一個流的數據&#xff0c;進而節省掉一個Sensor輸出處理兩次…

WPS word 已有多級列表序號

wps的word中&#xff0c;原來已生成的文檔里&#xff0c;已存在序號。比如&#xff0c;存在2、2.1、2.1.1、2.1.1.1、2.1.1.1.1 5層序號&#xff0c;而且已分為5級。但增加內容的時候&#xff0c;并不會自動增加序號&#xff0c;應該如何解決&#xff1f; 原來長這樣&#xff…

從零開始制作小程序簡單概述

以下是結合案例的“從零制作小紅書風格小程序”的全流程指南&#xff0c;采用小紅書爆款筆記的結構呈現&#xff0c;并附CSDN參考資源&#x1f447;&#xff1a; 一、核心開發步驟&#xff08;附工具推薦&#xff09; 賬號與定位 ? 注冊類型選擇&#xff1a;個人店&#xff08…

【Go語言基礎【13】】函數、閉包、方法

文章目錄 零、概述一、函數基礎1、函數基礎概念2、參數傳遞機制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 錯誤處理 二、函數類型與高階函數1. 函數類型定義2. 高階函數&#xff08;函數作為參數、返回值&#xff09; 三、匿名函數與閉包1. 匿名函數&#xff08;Lambda函…

網絡編程之服務器模型與UDP編程

一、服務器模型 在網絡通信中&#xff0c;通常要求一個服務器連接多個客戶端 為了處理多個客戶端的請求&#xff0c;通常有多種表現形式 1、循環服務器模型 一個服務器可以連接多個客戶端&#xff0c;但同一時間只能連接并處理一個客戶的請求 socket() 結構體 bind() listen() …

open3D:三維點云處理

open3d 點云數據處理 爆肝5萬字??Open3D 點云數據處理基礎&#xff08;Python版&#xff09;_python 點云 焊縫-CSDN博客 如何用NumPy讀取和保存點云數據 - 知乎 讀取并可視化點云 np.loadtxt 從txt中讀取點集&#xff0c;并open3d顯示單個點云 txt內容&#xff1a;每行皆…

使用聯邦多軌跡圖神經網絡(GNNs)結合稀缺數據預測嬰兒腦連接|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Predicting infant brain connectivity with federated multi-trajectory GNNs using scarce data 使用聯邦多軌跡圖神經網絡&#xff08;GNNs&#xff09;結合稀缺數據預測嬰兒腦連接 01 文獻速遞介紹 多模態影像下的嬰兒腦連接演化預測&#xff1a;聯邦學習與…

[特殊字符] 深入理解 Linux 內核進程管理:架構、核心函數與調度機制

Linux 內核作為一個多任務操作系統&#xff0c;其進程管理子系統是核心組成部分之一。無論是用戶應用的運行、驅動行為的觸發&#xff0c;還是系統調度決策&#xff0c;幾乎所有操作都離不開進程的創建、調度與銷毀。本文將從進程的概念出發&#xff0c;深入探討 Linux 內核中進…