Bash Shell腳本介紹

編寫Bash Shell腳本的詳細概述

Shell腳本是一種自動執行您通常在計算機上執行的任務的強大方法。

在本教程中,我將對Shell腳本進行全面的概述,並將作為創建實用Shell腳本的更深入和高級教程的基礎參考。

看看我的Bash簡介郵政。

Bash為您提供了一組可以組合在一起的命令,這些命令可用於創建小程序,按照慣例,我們將其稱為腳本。

注意區別。我們不是說Bash編程而是說Bash腳本,我們也沒有將Bash腳本稱為“ Bash程序”。這是因為在感覺腳本失控之前,您通常可以達到一定程度的複雜性。

但是Bash腳本很棒,因為您只需要Bash即可運行它們。沒有編譯器,沒有解釋器,只有您的shell。

Perl或JavaScript或Python等編程語言會遺漏許多東西。

變量沒有作用域,它們都是全局變量,沒有標準庫,例如,您沒有模塊系統。但是優點非常棒:您可以像在shell中一樣輕鬆地調用任何CLI工具,而Unix方法具有許多小的實用程序命令的確使Shell腳本大放異彩。執行網絡請求wget,使用awk, 和更多。

Shell腳本是您最好了解的工具之一,至少知道如何在看到程序時閱讀程序,以及它可以帶給您日常工作的好處。

本教程將引導您了解Bash腳本編制的理論和概念。我將在以後發布有關特定技術或如何解決特定問題的更詳細的教程。

基本

腳本存儲在文件中。您可以為shell腳本指定任何名稱和擴展名,這沒關係。重要的是,它必須在第一行以“ shebang”開頭:

#!/bin/bash

並且它必須是一個可執行文件。

使用以下命令將文件設置為可執行文件chmod,一個實用程序命令。

您可以像這樣使用它:

chmod u+x myscript

使myscript您的用戶的文件可執行文件(我不在這裡的權限兔子洞中,但我會盡快對其進行介紹)。

現在,如果您位於同一文件夾中,則可以通過調用腳本來執行該腳本./myscript,或使用完整路徑。

在學習的同時,我鼓勵您(如果可能)使用在線遊樂場像這個,它使事情更容易測試。

評論

註釋是編寫程序時最重要的事情之一。一行以#符號是註釋(除了您在上面看到的shebang線以外)。

#!/bin/bash
# this is a comment

評論也可以在行尾開始:

#!/bin/bash
echo ok # this is a comment

變數

您可以使用=操作員:

name=value

例子:

ROOM_NUMBER=237
name=Flavio
nickname="Flavio"

您可以使用echo內置命令並在前面加一個$改為var名稱:

echo $ROOM_NUMBER
echo $name

運營商

Bash實現了一些跨編程語言常用的算術運算符:

  • +添加
  • -減去
  • *
  • /劃分
  • %模(除法除法)
  • **求冪

您可以使用以下方法比較值

  • <
  • <=
  • ==
  • >=
  • >

您還可以使用以下比較運算符:

  • -lt低於
  • -gt比...更棒
  • -le低於或等於
  • -ge大於或等於
  • -eq等於
  • -ne不等於

這樣:

#!/bin/bash
age=23
minimum=18
if test $age -lt $minimum
then
  echo "Not old enough"
fi

邏輯運算符:

  • &&邏輯與
  • ||邏輯或

這些快捷方式允許執行算術運算,然後執行賦值:

  • +=
  • -=
  • *=
  • /=
  • %=

還有更多的運算符,但是那些是最常見的。

您可以使用echo命令:

#!/bin/bash
echo "test"
echo test
echo testing something

邏輯條件

AND:計算為0(零),如果兩者都commandanothercommand執行並返回0。在shell命令中返回零表示該命令成功。錯誤消息由非零返回值標識。

command && anothercommand

或:計算結果為0(零),如果至少有以下一項commandanothercommand執行並返回0

command || anothercommand

NOT:反轉邏輯返回值command

! command

控制結構

在其中可以使用您可能熟悉的幾種控制結構:

如果/其他語句

簡單的if

if condition
then
  command
fi

if然後else

if condition
then
  command
else
  anothercommand
fi

巢狀if- 然後 -else

if condition
then
  command
elif
  anothercommand
else
  yetanothercommand
fi

您可以保留else使用分號在同一行上:

if condition ; then
  command
fi

例子:

#!/bin/bash
DOGNAME=Roger
if [ "$DOGNAME" == "" ]; then
  echo "Not a valid dog name!"
else
  echo "Your dog name is $DOGNAME"
fi

注意括號嗎?當我們必須對布爾表達式進行任何形式的評估時,必須添加方括號。

循環

While循環

儘管condition解析為真實值,運行command

while condition
do
  command
done

直到

直到condition解析為真實值,運行command

until condition
do
  command
done

對於

遍歷列表並為每個項目執行命令

for item in list
do
  command
done

打破並繼續

在循環內部,您可以使用breakcontinue語句完全打破循環,或者只是跳過當前迭代。

案子

案例控制結構使您可以根據值選擇不同的路由。

case value in
  a)
    command
    #...
    ;;
  b)
    command
    #...
    ;;
esac

喜歡與fiesac結束案例結構,您會發現它是case向後拼寫。

在每種情況下,我們都添加一個雙分號。

一種*)case可以處理所有未明確表述的情況。用一個|符號,您可以為一個案例表達多種選擇。

例子:

#!/bin/bash
read -p "How many shoes do you have?" value
case $value in
  0|1)
    echo "Not enough shoes! You can't walk"
    ;;
  2)
    echo "Awesome! Go walk!"
    #...
    ;;
  *)
    echo "You got more shoes than you need"
    #...
    ;;
esac

選擇

一種select結構向用戶顯示一個可供選擇的菜單:

select item in list
do
  command
done

例子:

#!/bin/bash
select breed in husky setter "border collie" chiwawa STOP
do
  if [ "$breed" == "" ]; then
    echo Please choose one;
  else
    break
  fi
done

echo “You chose $breed

測試條件

我用這個詞condition在上述控制結構中。

您可以使用testBash內置命令來檢查條件並返回true(0)或假值(不是0)。

這是一個例子:

#!/bin/bash
if test "apples" == "apples"
then
  echo Apples are apples
fi

if ! test “apples” == “oranges” then echo Apples are not oranges fi

從命令行讀取輸入

您可以使用read內置命令。該命令從標準輸入中讀取一行,並且可以非常靈活地格式化輸入。

最簡單的用法是:

echo "Age:"
read age

這將打印“ Age:”(年齡:),您可以輸入數字,按Enter鍵,該數字將分配給age多變的。

-p的選擇read提供內置提示,並將輸入內容放入age多變的:

read -p "Age: " age

read該命令還有更多選項,您可以通過鍵入以下選項進行檢查help read在Bash中。

添加選項

使用連字符和字母來指定選項,如下所示:

ls -a
driveCar -b "Ford"

在代碼中,您使用內置命令getopts解析選項並獲取值。

如果我們接受選擇ab,我們餵getopts ab到一會兒循環。

如果選擇b接受一個值,我們附加一個冒號:之後,所以我們格式化getopts像這樣打電話:getopts ab: arg

這是一個片段:

while getopts xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    esac
done

在此腳本中,$OPTARG自動被分配了選擇字母。我們告訴getopts我們接受哪些選項,並且我們分別處理每種情況。

錯誤由以下人員自動處理getopts。我們可以選擇自己處理錯誤消息,方法是在冒號前加一個:在參數定義之前:getopts :xy: arg

然後我們還要處理\?:案件。當我們傳遞無效的選項時,第一個被調用,而當我們錯過一個選項時,第二個被調用:

while getopts :xy: arg
do
  case $arg in
    x) echo "Option $arg enabled" ;;
    y) echo "The value of $arg is $OPTARG" ;;
    :) echo "$0: Must supply an argument to -$OPTARG." >&2
       exit 1 ;;
    \?) echo "Invalid option -$OPTARG ignored." >&2 ;;
    esac
done

現在,如果您錯過添加參數的操作,錯誤消息將有所不同。

使用參數

在腳本內部,您可以訪問在調用時傳遞的任何參數。您可以使用訪問它們$0$1$2依位置而定,依此類推$0是命令的名稱,數字遞增,參數的位置遞增。在位置9之後,您需要大括號:${10}${11}

例如運行此startCar腳本:

#!/bin/bash
echo $0
echo $1

作為./startCar fiesta將打印

./startCar
fiesta

特別的$*語法顯示所有參數,並且$#傳遞的參數數量:

#!/bin/bash
echo $# $*
./test.sh Milan Florence Rome
3 Milan Florence Rome

將選項與參數分開

如果同時具有選項和參數,則需要將它們分開。您可以使用連字符進行此操作:

driveCar -m "Ford Fiesta" - Milan Florence Rome

使用字符串

給定一個字符串:

dogname="Roger"

你可以使用它來獲取長度${#dogname}

與字符串一起使用時,請始終在字符串兩邊使用引號,以避免Bash解釋其中的特殊字符。

您可以使用來比較2個字符串=或者==運算符,是一樣的:

"$dogname" = "$anotherdogname"
"$dogname" == "$anotherdogname"

這不是一項作業,因為周圍的空間=

您還可以檢查不平等情況:

"$dogname" != "$anotherdogname"

數組

數組是在括號內聲明的項目列表:

breeds=(husky setter "border collie" chiwawa)

您可以使用方括號引用數組中的任何項目:

breeds[0]
breeds[1]

您可以使用以下特殊語法獲取商品總數:

${#breeds[@]}

內置命令

到目前為止,您已經看到了一些內置命令,例如:

  • test
  • read
  • echo

Bash有很多。您可以通過致電查看所有內容help然後您可以使用以下命令找到每個命令的幫助help read

功能

就像在JavaScript或任何其他編程語言中一樣,您可以創建少量可重用的代碼,給它們起一個名字,並在需要時調用它們。

Bash稱他們為功能

您定義一個函數

function name {

}

例子:

function cleanFolder {

}

然後像這樣調用它:

cleanFolder

您可以將參數傳遞到文件夾,而無需聲明它們-您只需將它們引用為$1$2等等。就像您對腳本參數所做的那樣:

function cleanFolder {
  echo "Clean folder $1"
}
cleanFolder "/Users/flavio/Desktop"

免費下載我的Linux命令手冊


更多cli教程: