作為一名程式設計師,學習 bash 腳本非常重要。它允許我們編寫腳本來自動執行無聊和重複的任務。
腳本的應用和用途有很多。從管理系統進程到執行複雜的資料操作,bash 腳本幫助我們有效率地完成所有工作。
在接下來的 10 分鐘(是的,只有 10 分鐘!)中,我將透過範例介紹 bash 腳本編寫的基礎知識,以幫助您簡化工作流程。
聽起來很有趣嗎?
那麼,拿起您最喜歡的飲料,讓我們開始編寫腳本吧!
在我們深入研究之前,您需要以下內容:
Linux 或 macOS 系統(Windows 使用者可以使用 WSL)
任何文字編輯器(這裡我們將使用 Vim)
好奇心和嘗試的意願
就是這樣! :)
在本節中,我們將了解 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 腳本的基礎知識!
容易吧?
事情會變得更加容易,因為我們也將在接下來的部分中繼續使用它們。
作為開發人員,我們主要使用 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 的先前文字中
如果您想將輸出記錄在文件中,這非常有用。也保留你的錯誤。
就像其他程式語言一樣,我們也可以在 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 迴圈是 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 是 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
執行此命令後我們將得到:
在本文中,我們介紹了基本概念,從基本命令語法到更高級的主題(例如函數)。
希望您覺得這篇文章有用。如果是的話,請隨時與您的開發者朋友分享!
另外,追蹤我,了解更多類似內容:
如需付費合作,請發送電子郵件至: [email protected] 。
感謝您閱讀到最後。
原文出處:https://dev.to/arindam_1729/learn-bash-scripting-in-10-minutes-1jec