Linux中的Bash特殊變數


簡介

Bash (Bourne Again SHell) 是大多數 Linux 系統的預設 shell。它是一個命令語言直譯器,可以執行來自標準輸入、檔案或命令列引數的命令。Bash shell 提供了一組包含各種系統相關和使用者相關資訊的特殊變數。這些特殊變數用於高效地操作和訪問資料。在本文中,我們將透過示例探討 Linux 中的 bash 特殊變數。

什麼是 Bash 特殊變數?

Bash 特殊變數是預定義的變數,用於儲存系統和使用者相關資訊。它們以“$”符號開頭,並在 bash 指令碼中用於執行各種操作。一些 bash 特殊變數包括:

  • $0 − 用於儲存當前正在執行的指令碼或 shell 的名稱。

  • $# − 儲存傳遞給指令碼的命令列引數的數量。

  • $* − 將傳遞給指令碼的所有命令列引數儲存為單個字串。

  • $@ − 將傳遞給指令碼的所有命令列引數儲存為單獨的字串。

  • $? − 儲存最後執行命令的退出狀態。

  • $! − 儲存最後執行的後臺程序的程序 ID。

  • $IFS − 儲存內部欄位分隔符,用於將字串拆分為欄位。

訪問 Bash 特殊變數

Bash 特殊變數使用“$”符號後跟變數名來訪問。例如,要訪問當前正在執行的指令碼的名稱,可以使用以下命令:

echo $0

這將輸出指令碼的名稱。

同樣,要訪問傳遞給指令碼的命令列引數的數量,可以使用以下命令:

echo $#

這將輸出命令列引數的數量。

$0 變數

$0 變數儲存當前正在執行的指令碼或 shell 的名稱。它用於獲取指令碼名稱以將其顯示在輸出中或檢查指令碼是否正在執行。考慮以下示例:

示例

#!/bin/bash

echo "The name of script is: $0"

輸出

The name of script is: script.sh

$# 變數

$# 變數儲存傳遞給指令碼的命令列引數的數量。它用於在處理引數之前檢查引數的數量。考慮以下示例:

示例

#!/bin/bash

echo "The number of arguments is: $#"

輸出

如果我們使用三個命令列引數執行指令碼,我們將得到以下輸出:

The number of arguments is: 0

$* 和 $@ 變數

$* 和 $@ 變數分別將傳遞給指令碼的所有命令列引數儲存為單個字串和單獨的字串。$* 變數使用 IFS 變數的第一個字元分隔引數,而 $@ 變數使用空格分隔引數。考慮以下示例:

示例

#!/bin/bash

echo "The arguments using \$* are: $*"
echo "The arguments using \$@ are: $@"

輸出

如果我們使用三個命令列引數執行指令碼,我們將得到以下輸出:

The arguments using $* are: 
The arguments using $@ are: 

$? 變數

$? 變數儲存最後執行命令的退出狀態。它用於檢查最後執行的命令是否成功。命令的退出狀態是在 0 到 255 之間的整數值,其中 0 表示成功,任何非零值表示錯誤。考慮以下示例:

示例

#!/bin/bash

ls
echo "The exit status of last command is: $?"

輸出

main.sh
The exit status of last command is: 0

在此示例中,ls 命令列出當前目錄中的檔案,echo 命令顯示最後命令的退出狀態。由於 ls 命令成功執行,退出狀態為 0。

$$

$$ 變數儲存當前正在執行的指令碼或 shell 的程序 ID (PID)。它用於識別正在執行指令碼的程序。考慮以下示例:

示例

#!/bin/bash

echo "The process ID of current script is: $$"

輸出

The process ID of current script is: 1929919

在此示例中,echo 命令顯示當前指令碼的 PID。

$! 變數

$! 變數儲存最後執行的後臺程序的程序 ID (PID)。它用於檢查後臺程序的狀態或根據需要終止它。考慮以下示例:

示例

#!/bin/bash

sleep 10 &
echo "The process ID of last background process is: $!"

輸出

The process ID of last background process is: 12346

在此示例中,sleep 命令在後臺執行,echo 命令顯示後臺程序的 PID。

$IFS 變數

$IFS 變數儲存內部欄位分隔符,用於將字串拆分為欄位。它用於指定用於分隔字串中欄位的字元。預設情況下,IFS 變數設定為空格、製表符和換行符。考慮以下示例:

示例

#!/bin/bash

IFS=:
echo "Field 1:Field 2:Field 3" | while read f1 f2 f3
do
   echo "Field 1: $f1"
   echo "Field 2: $f2"
   echo "Field 3: $f3"
done

輸出

Field 1: Field 1
Field 2: Field 2
Field 3: Field 3

在此示例中,IFS 變數設定為“:”(冒號),echo 命令輸出一個包含三個用冒號分隔的欄位的字串。while 迴圈讀取字串並使用 IFS 變數將其拆分為欄位,echo 命令顯示各個欄位。

$LINENO 變數

$LINENO 變數用於顯示 bash 指令碼中的當前行號。它在除錯指令碼時特別有用,在這些指令碼中,您希望知道哪一行程式碼導致了特定錯誤。考慮以下示例:

示例

#!/bin/bash

echo "Line number: $LINENO"
echo "Line number: $LINENO"

輸出

Line number: 3
Line number: 4

在此示例中,echo 命令顯示 $LINENO 變數的值,該值在執行時自動設定為指令碼的行號。

$BASH_SOURCE 和 $FUNCNAME 變數

$BASH_SOURCE 和 $FUNCNAME 變數用於在函式中顯示當前正在執行的指令碼或函式的名稱。$BASH_SOURCE 變數顯示已執行的指令碼或函式的名稱,而 $FUNCNAME 變數顯示當前函式的名稱。考慮以下示例:

示例

#!/bin/bash

function func1 {
   echo "Function name: ${FUNCNAME[0]}"
   echo "Script name: ${BASH_SOURCE[0]}"
}

function func2 {
   func1
}
func2

輸出

Function name: func1
Script name: /path/to/script.sh

在此示例中,我們定義了兩個函式 func1 和 func2,並呼叫 func2。在 func2 內部,我們呼叫 func1,它顯示 $FUNCNAME 和 $BASH_SOURCE 的值。由於 func1 是當前函式,因此其名稱顯示為 $FUNCNAME 的值,指令碼名稱顯示為 $BASH_SOURCE 的值。

$SECONDS 變數

$SECONDS 變數用於顯示自指令碼開始執行以來經過的秒數。它在測量指令碼或指令碼特定部分的執行時間時特別有用。考慮以下示例:

示例

#!/bin/bash

echo "Script started at $(date)"
sleep 5
echo "Elapsed time: $SECONDS seconds"

輸出

Script started at Wed Mar 15 14:26:58 IST 2023
Elapsed time: 5 seconds

在此示例中,我們使用 $SECONDS 變數來顯示自指令碼開始執行以來經過的秒數。sleep 命令用於將指令碼的執行暫停 5 秒,並在 sleep 命令之後顯示經過的時間。

結論

Bash 特殊變數是 Linux 中 bash 指令碼的重要組成部分。它們提供了一種簡單有效的方法來訪問和作業系統和使用者相關資訊。在本文中,我們探討了一些常用的 bash 特殊變數,例如 $0、$#、$*、$@、$?、$$、$! 和 $IFS,以及它們用法的示例。透過在我們的指令碼中使用這些變數,我們可以增強 bash 指令碼的功能和可用性。

更新於:2023年7月14日

227 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.