變數 是存放資料的地方。 Bash 有兩種資料:字串和陣列。 陣列我們之後再談。
你可以這樣指定一個變數
name="value"
重要:等號兩邊不能有空格!
如果有空格,像這個例子:
x = 10
bash 會把 x 當成指令呼叫,並傳入 = 和 10 這兩個引數!
變數也可以稱為_參數_。 本文件中這兩個詞會交替使用。
bash 使用或設定的一些重要參數包括:
PATH:以冒號分隔的目錄清單,用來尋找外部指令。IFS:「內部欄位分隔符」。
我們會在下面看到它的用法。PWD:你目前的工作目錄。
它和 pwd 指令的輸出會是同一個值。RANDOM:0 到 32767 之間的偽隨機整數。BASH_VERSION:目前執行中的 bash 版本字串。變數名稱由_大寫字母、小寫字母、數字和底線_組成。 它不能以數字開頭。
你可以用 $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!"
還有許多其他有趣的參數展開:取出子字串、取得字串長度、_指定_預設值、從值的開頭或結尾移除文字等等。 你可以在手冊中讀到更多。