變數

變數 在 Bash

{other: "%{count} 個練習"}

關於 變數

變數

變數 是存放資料的地方。 Bash 有兩種資料:字串和陣列。 陣列我們之後再談。

你可以這樣指定一個變數

name="value"
Note

重要:等號兩邊不能有空格!

如果有空格,像這個例子:

x = 10

bash 會把 x 當成指令呼叫,並傳入 = 和 10 這兩個引數!

變數也可以稱為_參數_。 本文件中這兩個詞會交替使用。

bash 使用或設定的一些重要參數包括:

  • PATH:以冒號分隔的目錄清單,用來尋找外部指令。
  • IFS:「內部欄位分隔符」。 我們會在下面看到它的用法。
  • PWD:你目前的工作目錄。 它和 pwd 指令的輸出會是同一個值。
  • RANDOM:0 到 32767 之間的偽隨機整數。
  • BASH_VERSION:目前執行中的 bash 版本字串。

變數名稱

變數名稱由_大寫字母、小寫字母、數字和底線_組成。 它不能以數字開頭。

Caution

最佳做法是避免使用全部大寫的變數名稱。 殼層把這個慣例用在它自己的參數上,你應該不會想意外覆蓋掉帶有特殊意義的殼層參數。 例如:1、2、3

參數展開

你可以用 $varname 語法取得參數的值。

x=10
echo "The value of x is $x"

為了避免變數名稱和周圍的文字混淆,你可以把變數名稱用大括號包起來。 例如要印出字串 10x10

echo "${x}x$x"
# or
echo "${x}x${x}"

有些風格指南建議在大多數情況下加上大括號,以提升可讀性或一致性。

位置參數

就像我們在指令與引數這一課討論過的,指令可以接受引數。 Bash 腳本也不例外。 傳給目前這個 bash 實例的引數稱為_位置參數_。 它們可以用這些特殊參數取得:

  • $1:第一個位置參數
  • $2 ... $9:接下來的參數
  • ${10} ...:兩位數以上需要用大括號。
  • $0:目前腳本的名稱。

傳給殼層函式的引數也是位置參數,處理方式完全相同。 我們之後的課程會再談到函式。

特殊位置參數

有些_特殊參數_可以幫助你處理位置參數。

  • $# 會展開成位置參數的_數量_。
  • "$@" 會展開成所有位置參數的清單,每一個各自成為一個單詞。
  • "$*" 會展開成單一字串,把所有位置參數用一個字元串接起來。
    • 用來串接的字元是 $IFS 變數的_第一個字元_,預設是空格。

"$@" 是把位置參數傳給另一個指令時最安全的方式,同時能確保它們正確地被引號包住。 你也會用它來逐一走訪位置參數:

for arg in "$@"; do
    do_something_with "$arg"
done

實務上,"$@" 比 "$*" 更常被使用。

指令替換

在 bash 腳本裡,你經常會做的一件事是擷取某個指令的輸出,並把它存進變數。 要做到這點,你會用到_指令替換_。

var=$(command)

舉例來說,要把字串轉成大寫,你可以這樣做:

text="Hello world!"
uppercase=$(echo "$text" | tr '[:lower:]' '[:upper:]')
echo "$uppercase"
# => HELLO WORLD!

參數展開的更多用法

Bash 內建許多工具可以操作變數和字串,讓你不必呼叫外部指令。

  • 把文字轉成大寫。 上一節我示範了如何用 tr 把文字轉成大寫。 要在 bash 裡做到這件事:

    echo "${text^^}"
    

    同樣地,${text,,} 會把值轉成小寫。

  • 當變數是空的時候提供一個預設值。

    default="nothing here"
    result=""
    echo "${result:-$default}"
    # => nothing here
    
  • 搜尋並取代。

    text="Hello world!"
    echo "${text//[aeiou]/X}"
    # => HXllX wXrld!"
    

還有許多其他有趣的參數展開:取出子字串、取得字串長度、_指定_預設值、從值的開頭或結尾移除文字等等。 你可以在手冊中讀到更多。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟