介紹

作為一名程式設計師,學習 bash 腳本非常重要。它允許我們編寫腳本來自動執行無聊和重複的任務。

腳本的應用和用途有很多。從管理系統進程到執行複雜的資料操作,bash 腳本幫助我們有效率地完成所有工作。

在接下來的 10 分鐘(是的,只有 10 分鐘!)中,我將透過範例介紹 bash 腳本編寫的基礎知識,以幫助您簡化工作流程。

聽起來很有趣嗎?

動圖

那麼,拿起您最喜歡的飲料,讓我們開始編寫腳本吧!

先決條件

在我們深入研究之前,您需要以下內容:

  1. Linux 或 macOS 系統(Windows 使用者可以使用 WSL)

  2. 任何文字編輯器(這裡我們將使用 Vim)

  3. 好奇心和嘗試的意願

就是這樣! :)

基礎知識

在本節中,我們將了解 bash 腳本的基本命令。我們將在大多數地方使用這些命令,它們非常容易理解,所以看一下它們,您就可以開始了!

首先,我們建立一個新資料夾(也稱為目錄)來儲存檔案。為此,我們使用 mkdir 命令,它代表「建立目錄」。使用方法如下:

mkdir <directory name>

此命令將在您當前位置建立一個新資料夾/目錄。

現在,我們已經有了目錄,讓我們開始吧。要進入該目錄,我們將使用代表「更改目錄」的 cd 命令:

cd <directory name>

終端機螢幕截圖

正如我們在上圖中看到的,我們位於目錄“Arindam”內

但如果你想回到以前的狀態怎麼辦?

沒問題!

使用cd ..返回上級目錄:

cd ..

終端機螢幕截圖

現在,如果我們想查看當前目錄中的 amd 資料夾中的文件,我們可以使用 ls 命令:

ls

這將列出當前目錄中的所有文件和資料夾:

終端機螢幕截圖

讓我們建立一個新文件。我們可以使用 touch 指令來做到這一點:

# syntax: touch <filename>

touch my_first_file.txt

這將在我們的目前資料夾中建立一個名為「my_first_file.txt」的空檔案。

有時,我們可能會忘記我們正在哪個目錄中工作。

不用擔心!

要取得目前工作目錄,我們可以使用pwd指令,它代表「列印工作目錄」:

pwd

這將顯示您目前位置的完整路徑。

終端機螢幕截圖

最後,讓我們在螢幕上列印一些內容。為此,我們使用echo命令:

echo "Hello World"

這將顯示“Hello, Bash World!”在你的終端機中:

終端機螢幕截圖

至此,我們已經學習了 Bash 腳本的基礎知識!

容易吧?

事情會變得更加容易,因為我們也將在接下來的部分中繼續使用它們。

編寫第一個 Bash 腳本

作為開發人員,我們主要使用 VS Code 或其他文字編輯器來編寫程式碼。但對於編寫 bash 腳本,最好使用基於終端的編輯器,如 vim、neovim。

在本指南中,我將使用 vim。

注意:如果您第一次退出 vim 時遇到困難,請不要太擔心。我們都去過那裡一次:)

# Command: vim <file name>

vim hello.txt

這將建立一個hello.txt檔案並使用 vim 開啟。你會得到如下介面:

終端機螢幕截圖

但是等等!我們不能在這裡寫任何東西!

為什麼?

原因很簡單,預設情況下 vim 以唯讀模式開啟檔案。為了能夠在上面寫入,請按“i”,然後它將啟動插入模式,現在我們可以在文件上寫入:

終端機螢幕截圖

現在,如何儲存這個檔案?

這很簡單!

首先,我們將透過按esc退出插入模式,然後我們只需按:w

終端機螢幕截圖

這將更新更改並保存它:

終端機螢幕截圖

現在我們必須擺脫許多初學者都苦苦掙扎的 vim。

好吧,不再是了。

要退出 vim 編輯器,只需輸入:q即可退出 vim 編輯器。

終端機螢幕截圖

專業提示:您可以將這些命令與:wq組合起來一次性保存並退出。

另外,如果我們想列印文件的內容,我們將使用

# command: cat <file name>
cat hello.txt

我們將獲得剛剛建立的檔案 hello.txt 的內容

終端機螢幕截圖

現在,讓我們建立第一個 bash 腳本。

先建立一個Command.sh文件,然後用vim打開

vim firstCommand.sh

在此文件中,我們加入以下內容:

終端機螢幕截圖

並使用:wq儲存此文件

#!/bin/bash是告訴 shell 腳本使用哪個解釋器的方法。

現在,我們將編寫第一個 shell 腳本。

bash firstCommand.sh

我們會得到以下結果:

終端機螢幕截圖

但是如果我們嘗試執行該文件,我們將收到權限被拒絕的錯誤。

終端機螢幕截圖

在Linux中,我們需要授予檔案權限以充當可執行檔。我們將使用以下命令授予權限:

chmod +x firstCommand.sh

這將使我們的檔案firstCommand.sh可執行。現在,如果我們執行該文件,我們將得到:

終端機螢幕截圖

現在可以了!這樣我們就建立了第一個 Bash 腳本!

變數

在 Bash 中我們也可以使用變數。

假設我們要將某些內容從一個位置複製到另一個位置。一般方法是:

cp my/location/path/from my/location/path/to

現在,如果我們使用變數,它將是:

LOC=my/location/path

cp $LOC/from $LOC/to

這更具可讀性,不是嗎?

還有額外的好處:如果您稍後需要更改路徑,只需在一個地方更改即可!

立場論據

現在,我們將學習位置參數,顧名思義,它從特定位置取得參數。

立場論據

我們將參數寫在腳本後面作為參數,並根據它們的位置存取它們。

讓我們透過一個例子來理解這一點,我們將建立一個新腳本,它將接受兩個位置參數並列印它們。

使用以下命令建立一個新檔案:

vim PosArg.sh

並加入以下程式碼。

終端機螢幕截圖

仔細看,這裡我們使用$1$2進行位置參數

接下來,保存它並使其可執行(正如我們在前面幾節中所做的那樣)。

之後,讓我們用兩個參數來執行可執行檔!

終端機螢幕截圖

我們得到了預期的結果。這就是我們在 bash 腳本中使用位置參數的方式。

管道

bash 最常用的功能之一是管道,它使得對另一個命令的輸出執行特定操作變得非常容易。

例如,命令的輸出非常長,您想要對其進行過濾。

我們可以使用管道在一個命令中執行相同的操作,而不是複製該輸出並貼上到另一個命令中。

讓我們了解管道的工作原理!

我們將使用以下命令以長格式列出 bin 目錄的內容:

ls -l /usr/bin

我們會得到很多文件。請參閱下面的螢幕截圖。

終端機螢幕截圖

正如您所看到的,輸出非常長,我們無法直接複製此輸出以用於管道。

在這裡,我們將使用管道從輸出中僅過濾 bash 檔案。讓我們將命令更新為:

ls -l /usr/bin | grep bash

grep 用於搜尋檔案/資料夾中的特定模式。

現在它只會顯示 bash 檔案:

終端機螢幕截圖

這就是它的簡化方式

輸入/輸出重定向

好吧,讓我們探索 Bash 中輸入/輸出重定向的奇妙世界。當您學習如何執行此操作後,您將能夠控制電腦發送訊息的位置,就像魔術一樣!

透過輸入重定向,我們可以從檔案而不是鍵盤獲取輸入。

例如,如果我們想從文件中過濾一個單詞,我們可以簡單地透過輸入重定向來實現。我們將傳遞文件作為輸入。

grep "example" < input.txt

這將為我們提供input.txt中單字 example 的出現情況

如果我們想向命令提供多行輸入,我們可以使用<< 。當我們編寫<<運算符時,我們將立即在其後面加入一個單詞,該單詞將打開和關閉我們想要輸入的文字。

很多人寫 EOF 來開始和結束,但這不是強制性的,你可以使用任何你想要的東西。在此範例中,為簡單起見,我們將使用 EOF。

cat << EOF
> Hey Everyone
> Hope your'e liking this guide
> if so, feel free to share your thoughts
> Thanks
> EOF

現在,我們將在終端機中看到 EOF 之間寫入的文字:

終端機螢幕截圖

現在,讓我們翻轉腳本並討論輸出重新導向。這就是事情變得非常有趣的地方!

輸出重定向允許我們將命令輸出發送到檔案而不是終端。例如,如果我們要將echo "hello world"指令的輸出放入檔案hello.txt中,請執行下列指令。

echo "hello world" > hello.txt

> 符號就像一個漏斗,它將輸出定向到檔案中,而不是在終端中列印出來。

現在讓我們來看看hello.txt檔。為此,執行

cat hello.txt

我們將看到以下內容:

終端機螢幕截圖

同樣,讓我們嘗試向hello.txt加入另一個輸出。執行以下命令:

echo "Hello Arindam, How are you?" > hello.txt

現在,如果我們看到hello.txt的內容,我們會看到它已覆蓋該檔案:

終端機螢幕截圖

因此,如果我們需要將輸出附加到文件中,我們需要使用>>而不是>

讓我們嘗試使用>>將輸出附加到hello.txt

echo "Follow me on Twitter: @Arindam_1729" >> hello.txt

現在,我們將看到文字被附加到 hello.txt 的先前文字中

終端機螢幕截圖

如果您想將輸出記錄在文件中,這非常有用。也保留你的錯誤。

if/else 語句

就像其他程式語言一樣,我們也可以在 Bash 中編寫 if else 語句。

它的語法是:

if (condition);then
 statement
elif(condition);then
 statement
else
 statement
fi

讓我們嘗試透過一個例子來使用它

我們將建立一個腳本,該腳本將採用使用者名稱,如果使用者名稱是 Arindam,那麼它將列印歡迎管理員,否則它將列印「您不是管理員,以管理員身分登入」。

#!/bin/bash

if [[ "${1,,}" = "arindam" ]]; then
    echo "Hey Admin, Welcome to our Bash Tutorial."
elif [[ "${1,,}" = "magician" ]]; then
    echo "Hey Magician, You don't have Admin Access"
else
    echo "You Don't have Admin access, login as an Admin"
fi

現在讓我們嘗試使用不同的參數來執行它:

終端機螢幕截圖

案例陳述

if/else 語句適合檢查小條件。但隨著病情數量的增加,管理變得越來越困難。在這種情況下,我們可以使用 Case 語句

case EXPRESSION in

  PATTERN_1)
    STATEMENTS
    ;;

  PATTERN_2)
    STATEMENTS
    ;;

  PATTERN_N)
    STATEMENTS
    ;;

  *)
    STATEMENTS
    ;;
esac

讓我們透過一個範例來理解這一點,我們將使用 case 語句來實現前面的範例。

因此,為此,程式碼將是:

#!/bin/bash

case ${1,,} in
        "arindam")
                echo "Hey Admin, Welcome to our Bash Tutorial."
                ;;
        "magician")
                echo "Hey Magician, You don't have Admin Access"
                ;;
        *)
                echo "You Don't have Admin access, login as an Admin"
                ;;
esac

現在,讓我們執行程式碼並查看結果:

終端機螢幕截圖

工作完美。這裡它還加入了一個結構並使程式碼對所有人更具可讀性。

陣列

我們可以為清單中收集的變數分配多個值。我們稱這些變數為陣列。

讓我們建立第一個陣列:

FIRST_ARRAY=(one two three four five six)

現在我們將列印該陣列。為此,讓我們嘗試列印變數(通常我們會這樣做):

echo $FIRST_ARRAY

終端機螢幕截圖

但是,正如您所看到的,我們只獲取陣列的第一個元素。為了列印整個陣列,我們需要這樣寫

echo ${FIRST_ARRAY[@]}

現在我們可以取得陣列的所有元素:

終端機螢幕截圖

我們也可以根據索引列印各個元素。為此,語法將是:

# Replace INDEX_OF_THE ELEMENT with the index of the element that you want to print 
echo ${FIRST_ARRAY[INDEX_OF_THE ELEMENT]}

For循環

For 迴圈是 Bash 腳本中的基本建構塊。它們使我們能夠自動執行重複性任務,有效地處理多個專案。語法是:

#!/bin/bash

for n in a b c;
do
   echo $n
done

現在,讓我們嘗試列印先前使用 for 迴圈建立的陣列的專案。

 for item in ${FIRST_ARRAY[@]};
 do 
     echo $item; 
 done

此循環迭代 FIRST_ARRAY 的每個元素。 [@] 表示法是指陣列中所有元素的參數擴展。當與 ${...} 一起使用時,它擴展到陣列元素的完整列表

如果我們執行這個我們會得到:

終端機螢幕截圖

如果要刪除新行,只需在 echo 命令中新增-n即可。

功能

在某些場景下,我們有很多程式碼需要多次呼叫。這就是函數派上用場的地方。它們就像您可以在需要時呼叫的小程式碼片段。

在 Bash 腳本中,函數是組織和重複使用程式碼的強大工具。它本質上是一組可以多次呼叫的命令。

它的語法如下:

function_name () {
  commands
}

這些函數是腳本中的小程序,我們可以在腳本中執行它們。有了這個,我們就可以使我們的程式碼可重複使用。

現在讓我們建立第一個函數。

vim bashfn.sh

並新增以下腳本:

#!/bin/bash

first_fn () {
   echo 'This is my first Bash function'
}

first_fn

現在,如果我們執行這個腳本,我們將得到:

終端機螢幕截圖

我們也可以將參數傳遞給 bash 函數。要將參數傳遞給函數,我們必須在函數呼叫之後新增參數。

讓我們在腳本中建立一個新函數並向其傳遞一個參數。

#!/bin/bash

first_fn () {
   echo 'This is my first Bash function'
}

first_arg(){
   echo "this is the first argument: $1"
}

first_fn

first_arg Arindam

現在,如果我們執行這個腳本,我們將得到:

終端機螢幕截圖

AWK

Awk 是 Bash 中最有用的工具之一。我們使用 AWK 來過濾文件內容或命令的輸出,以便我們獲得輸出的基本部分以及我們喜歡的方式。

基本語法是:

# This will print the whole content of the file
awk '{ print }' /path/to/file

讓我們透過一個例子來理解這一點,我們將從文字檔案中過濾一個單字並列印它。

首先,我們建立一個文字檔案temp.txt並新增文字。我們將使用輸出重定向來建立它:

echo Arindam Magician Mohun Bagan Barcelona > temp.txt

現在,我們將使用 awk 過濾文字檔案temp.txt中的文字:

如果我們想要列印特定文本,例如第一個/第二個單詞,那麼我們可以使用$1$2

如果我們想要列印文件的全部內容,我們將保留列印語句{print }

注意:預設情況下,awk 使用空格字元作為分隔符

這是結果:

終端機螢幕截圖

我們可以使用不同的字元作為分隔符,而不是預設的分隔符。

讓我們建立一個 CSV 檔案並理解這一點:

echo Arindam,Magician,Mohun Bagan,Barcelona > temp.csv

這裡我們將使用“,”而不是 awk 的預設分隔符

為此,命令將是:

awk -F, {print $3} temp.csv

在這裡,現在我們將得到第三個元素:

終端機螢幕截圖

如果仔細觀察,第三個單字是用空格分隔的,但我們並沒有將其視為我們提到的“,”作為分隔符號。

我們也可以將 awk 與使用管道的命令一起使用。

echo "hello Arindam" | awk '{print $2}'

如果我們執行這個,我們會得到:

終端機螢幕截圖

有時我們想要更改文字檔案中的某個值,這就是 sed 非常有用的地方。

SED 是一個命令列工具,可讓我們使用正規表示式修改文字檔案中的某些值。

文法如下:

sed 's/text_to_change/to_this_text/g' filename

讓我們建立一個包含一些虛擬文字的檔案testsed.txt

終端機螢幕截圖

現在,從該文本中,我們將用 Arindam 替換 Messi 的單字。

sed 's/messi/arindam/g' testsed.txt

執行此命令後我們將得到:

終端機螢幕截圖

結論

在本文中,我們介紹了基本概念,從基本命令語法到更高級的主題(例如函數)。

希望您覺得這篇文章有用。如果是的話,請隨時與您的開發者朋友分享!

另外,追蹤我,了解更多類似內容:

https://dev.to/arindam\_1729

如需付費合作,請發送電子郵件至: [email protected]

感謝您閱讀到最後。

如何使用程式碼片段功能? - 問題 - Sparkle 社區


原文出處:https://dev.to/arindam_1729/learn-bash-scripting-in-10-minutes-1jec

按讚的人:

共有 0 則留言