shell簡明教程1簡潔的shell腳本

来源:https://www.cnblogs.com/testing-/archive/2023/08/03/17601496.html
-Advertisement-
Play Games

module_init是linux內核提供的一個巨集, 可以用來在編寫內核模塊時註冊一個初始化函數, 當模塊被載入的時候, 內核負責執行這個初始化函數. 在編寫設備驅動程式時, 使用這個巨集看起來理所應當, 沒什麼特別的, 但畢竟我還是一個有點追求的程式員嘛:P, 這篇文章是我學習module_init... ...


1簡潔的shell腳本

1.1 Hello

腳本是包含一系列命令的命令行程式。 腳本中包含的命令由解釋器執行。 在shell腳本中,shell充當解釋器,一條接一條地執行腳本中列出的命令。
任何可以在命令行中執行的命令都可以放入shell腳本中。shell腳本是自動執行任務的好幫手。
讓我們來看簡單的shell腳本script1.sh:

#!/bin/bash
echo "Scripting is fun!"

在嘗試執行腳本之前,請確保它是可執行的

$ chmod +x script-01.sh
$ ./script-01.sh 
Scripting is fun!

你會註意到,腳本的第一行以'#!'開頭,後面是bash shell程式'/bin/bash'的路徑。'#!'可以讀成 "sharp bang"。 當腳本的第一行以'#!'可開頭時,後面的內容將被用作腳本中所列命令的解釋器。

1.2 變數

您可以在 shell 腳本中使用變數。變數就是有名稱的存儲位置。 你可以把變數看作是名稱-值對。要為變數賦值,請使用語法VARIABLE_NAME="Value"。 等號前後不要使用空格。此外,變數是區分大小寫的,按照慣例,變數名是大寫的。要使用變數,請在變數名前加上美元符號。

$ cat script-05.sh 
#!/bin/bash
MY_SHELL="bash"
echo "I like the $MY_SHELL shell."
$ ./script-05.sh 
I like the bash shell.

也可以用大括弧括住變數名,併在大括弧前加上美元符號。 語法 ${variable_name} .

$ cat script-06.sh 
#!/bin/bash
MY_SHELL="bash"
echo "I like the ${MY_SHELL} shell."
$ ./script-06.sh 
I like the bash shell.

變數前面或後面非空格時通常建議加上大括弧,否則會把整個字元串當成變數。

$ ./script-07.sh 
I am bashing on my keyboard.
$ cat script-08.sh 
#!/bin/bash
MY_SHELL="bash"
echo "I am $MY_SHELLing on my keyboard."
$ ./script-08.sh 
I am  on my keyboard.

您還可以將命令的輸出賦值給變數, 用"$(命令)"即可,"$(命令)"用來替換原來的"hostname"

$ cat script-09.sh 
#!/bin/bash
SERVER_NAME=$(hostname)
echo "You are running this script on ${SERVER_NAME}."
$ ./script-09.sh 
You are running this script on andrew-HP.
$ cat script-10.sh 
#!/bin/bash
SERVER_NAME=`hostname`
echo "You are running this script on ${SERVER_NAME}."
$ ./script-10.sh 
You are running this script on andrew-HP.

1.3 有效的變數名

變數名可以包含字母、數字和下劃線。 變數名可以字母或下劃線開頭,但不能以數字開頭。 以下是有效變數名的示例。

# 有效的變數名
FIRST3LETTERS="ABC"
FIRST_THREE_LETTERS="ABC"
firstThreeLetters="ABC"

# 無效變數名
3LETTERS="ABC"
first-three-letters="ABC"
first@Three@Letters="ABC"

1.4 測試

設計腳本的目的是為了取代人在鍵盤前輸入一系列命令的工作。 如果您想自動執行一項任務,但需要根據不同的情況執行不同的操作,該怎麼辦?由於在需要運行腳本時,人可能不在身邊,無法做出決定,因此我們需要對這些情況進行測試,並讓腳本採取相應的行動。
要創建測試,請在括弧中加入一個條件表達式。 語法如下 "[ 測試條件 ]" 。你可以測試幾種情況。 例如,可以比較字元串是否相等、數字是否大於另一個數字或文件是否存在。 下麵測試檢查/etc/passwd是否存在。如果存在,則返回true。如果文件不存在,則返回false。 即命令以狀態1退出。

[ -e /etc/passwd ]

如果使用的是bash shell,可以運行help test命令查看可以執行的各類測試。 也可以閱讀test的man頁面:man test 。 下麵是一些比較常見的測試。

  • 文件操作符:

    • -d FILE 如果FILE是目錄,則為真。
    • -e FILE 如果FILE存在,則為真。
    • -f FILE 如果FILE存在且是普通文件,則為真。
    • -r FILE 如果FILE可讀取,則為True。
    • -s FILE-如果FILE存在且不是空文件,則為True。
    • -w FILE 如果FILE可寫入,則為True。
    • -x FILE 如果FILE執行可,則為True。
  • 字元串操作符

    • -z STRING如果字元串為空,則為True。
    • -n STRING-如果字元串不為空,則為True。
    • STRING 字元串不為空時為True。
    • STRING1 = STRING2 如果字元串相等,則為True。
    • string1 != string2 如果字元串不相等,則為 rue。
  • 算術運算符

    • arg1 -eq arg2 如果arg1等於arg2,則為True。
    • arg1 -ne arg2 如果arg1不等於arg2,則為True。
    • arg1 -lt arg2 如果arg1小於arg2,則為True。
    • arg1 -le arg2 True如果arg1小於或等於arg2。
    • arg1 -gt arg2 True如果arg1大於arg2。
    • arg1 -ge arg2 如果arg1大於或等於arg2,則為True。

1.5 if語句

既然知道瞭如何判斷某個條件是否為真,就可以結合if語句在腳本中做出判斷。
if語句以"if"開頭,然後是一個測試。下麵一行包含then. 接下來是一系列命令,如果測試條件為真,這些命令將被執行。最後,if語句以 fi結尾。 語法如下

if [ condition-true ]
then
   command 1
   command 2
   ...
fi

下麵是一個例子

$ cat script-11.sh 
#!/bin/bash

MY_SHELL="bash"

if [ "$MY_SHELL" = "bash" ]
then
  echo "You seem to like the bash shell."
fi
$ ./script-11.sh 
You seem to like the bash shell.

在進行條件測試時,最好用引號將變數括起來,以防止一些意想不到的結果。

使用if/else語句還可以在條件不為真時執行操作。 下麵是if/else語句的例子。

if [ condition-true ]
then
   command 1
    command 2
   ...
else  #
   command 3
   command 4
   ...
fi

修改代碼走else:

#!/bin/bash

MY_SHELL="csh"

if [ "$MY_SHELL" = "bash" ]
then
  echo "You seem to like the bash shell."
else
  echo "You don't seem to like the bash shell."
fi
$ ./script-12.sh
You don't seem to like the bash shell.

還可以使用elif來測試多個條件。elif是"else if"的縮寫。 和if一樣,在elif後面加上要測試的條件。 在下一行,使用 then. 最後,如果條件為真,則執行一系列命令。

if [ condition-true ]
then
   command 1
   command 2
   ...
elif [ condition-true ]
then
   command 3
   command 4
   ...
else  #
   command 5
    command 6
   ...
fi

走elif的示例:

#!/bin/bash

MY_SHELL="csh"

if [ "$MY_SHELL" = "bash" ]
then
  echo "You seem to like the bash shell."
elif [ "$MY_SHELL" = "csh" ]
then
  echo "You seem to like the csh shell."
else
  echo "You don't seem to like the bash or csh shells."
fi
$ ./script-13.sh
You seem to like the csh shell.

參考資料

1.6 FOR迴圈

如果要對列表執行操作,可以使用for迴圈。for迴圈的第一行以"for"開頭,然後是變數名,接著是 "in",然後是項目列表。 下一行包含單詞"do"。將要執行的語句放在下麵幾行,最後以單行 "done"結束 for 迴圈。

for VARIABLE_NAME in ITEM_1 ITEM_2 ITEM_N
do
  command 1
  command 2
  ...
done

列表中的第一項被賦值給變數,代碼塊被執行。然後將列表中的下一項分配給變數,並執行命令。

$ cat script-14.sh
#!/bin/bash

for COLOR in red green blue
do
  echo "COLOR: $COLOR"
done
$ ./script-14.sh
COLOR: red
COLOR: green
COLOR: blue

這個名為rename-pics.sh的shell腳本會重命名所有以jpg結尾的文件,在原文件名前加上今天的日期。

#!/bin/bash

PICTURES=$(ls *jpg)
DATE=$(date +%F)
for PICTURE in $PICTURES
do
  echo "Renaming ${PICTURE} to ${DATE}-${PICTURE}"
  mv ${PICTURE} ${DATE}-${PICTURE}
done

下麵是運行此腳本後的結果。

$ ls
bear.jpg  man.jpg  pig.jpg  rename-pics.sh
$ ./rename-pics.sh
Renaming bear.jpg to 2023-08-03-bear.jpg
Renaming man.jpg to 2023-08-03-man.jpg
Renaming pig.jpg to 2023-08-03-pig.jpg
$ ls
2023-08-03-bear.jpg  2023-08-03-man.jpg  2023-08-03-pig.jpg  rename-pics.sh
$

1.7 位置參數

位置參數是包含命令行內容的變數。腳本本身存儲在$0,第一個參數存儲在$1,第二個參數存儲在$2,以此類推。 以下麵的命令行為例

$ script.sh parameter1 parameter2 parameter3

內容如下: $0為"script.sh",$1為 "parameter1",$2為 "parameter2",$3為 "parameter3"。
這個名為archive_user.sh的腳本接受一個用戶名參數。


#!/bin/bash

echo "Executing script: $0"
echo "Archiving user: $1"

# Lock the account
passwd -l $1

# Create an archive of the home directory.
tar cf /archives/${1}.tar.gz /home/${1}

特殊變數$@,可以訪問命令行上從$1開始到最後一個的所有位置參數。 以下是如何更新 archive_user.sh 腳本以接受一個或多個參數。

#!/bin/bash

echo "Executing script: $0"

for USER in $@
do
  echo "Archiving user: $USER"

  # Lock the account
  passwd -l $USER

  # Create an archive of the home directory.
  tar cf /archives/${USER}.tar.gz /home/${USER}
done

讓我們向腳本傳遞多個用戶。

$ ./archive_user.sh chet joe
Executing script: ./archive_user.sh
Archiving user: chet
passwd: password expiry information changed.
tar: Removing leading `/' from member names
Archiving user: joe
passwd: password expiry information changed.
tar: Removing leading `/' from member names

1.8 獲取用戶輸入

如果要接受標準輸入,請使用read命令。標準輸入通常來自鍵盤輸入,但也可能來自其他來源,如命令管道中命令的輸出。read命令的格式是read -p "PROMPT" VARIABLE_NAME 。 此版本的 archive_user.sh腳本會詢問用戶賬戶。

#!/bin/bash

read -p "Enter a user name: " USER
echo "Archiving user: $USER"

# Lock the account
passwd -l $USER

# Create an archive of the home directory.
tar cf /archives/${USER}.tar.gz /home/${USER}

讓我們運行此腳本,將mitch賬戶存檔。

 ./archive_user.sh
Enter a user name: mitch
Archiving user: mitch
passwd: password expiry information changed.
tar: Removing leading `/' from member names
$

釘釘或微信號: pythontesting 微信公眾號:pythontesting
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [toc] # Autofac Autofac 是一款超贊的.NET IoC 容器 . 它管理類之間的依賴關係, 從而使 應用在規模及複雜性增長的情況下依然可以輕易地修改 . 它的實現方式是將常規的.net類當做 組件 處理. 控制反轉背後的核心思想是, 我們不再將應用中的類捆綁在一起, 讓類自己去 ...
  • Swagger是一個規範且完整的框架,用於生成、描述、調試和可視化Restfull風格的Web服務。Swagger的目標是對Rest API定義一個標準且和語言無關的介面,可以讓人和電腦擁有無需訪問源碼、文檔或網路流量監控就可以發現和連接服務的能力。當通過Swagger進行正確定義,用於可以理解遠... ...
  • # Unity IPostprocessBuildWithReport Unity IPostprocessBuildWithReport是Unity引擎中的一個非常有用的功能,它可以讓開發者在構建項目後自動執行一些操作,並且可以獲取構建報告。這個功能可以幫助開發提高工作效率,減少手動操作的時間和錯 ...
  • 個人博客 前端:https://lujiesheng.cn 個人博客 後端:https://api.lujiesheng.cn 個人博客 運維:https://portainer.lujiesheng.cn # 1. 伺服器準備 我採用的是 騰訊雲輕量應用伺服器(2C 4G 8M 80G),配置如下 ...
  • 我的一位朋友前陣子遇到一個問題,問題的核心就是try……catch……finally中catch和finally代碼塊到底哪個先執。這個問題看起來很簡單,當然是“catch先執行、finally後執行”了?真的是這樣嗎? 有下麵一段C#代碼,請問這段代碼的執行結果是什麼? public static ...
  • ### 用Xshell 遠程連接虛擬機 如果按[前面博客](https://www.cnblogs.com/AndrewNotes/p/17589321.html)裝好虛擬機,**會發現剛裝好的虛擬機直接連Xshell連不上,宿主機也ping不通虛擬機,這就需要修改VMware的預設網路配置** * ...
  • ### Linux簡介 ```bash # Linux是什麼? 與大家熟知的 Windows 操作系統軟體一樣,Linux 也是一個操作系統軟體。但是與Windows 不同的是,Linux 是一套開放源代碼程式的、並且可以自由傳播的類 Unix操作系統軟體。其在設計之初,就是基於 Intel x86 ...
  • ## 許可權機制和性能指標 前面我們學完了`操作文件`和`用戶`相關知識,本篇學習`許可權`和`性能`相關知識。 ### 文件的屬性看起 看 linux 的許可權,先從文件的屬性看起 ls -l 加 `-d` 是只看這個文件夾: ```javascript pjl@pjl-pc:~$ sudo ls -l ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...