Unix / Linux - 特殊變量

你好,有抱負的程序员們!我很高興能成為你們在Unix和Linux特殊變量世界的向導。作為一個教了多年計算機科學的人,我可以向你們保證,掌握這些概念將會在你們的編程冒險中改變遊戲規則。那麼,我們來深入探討一下吧!

Unix / Linux - Special Variables

特殊變量的介紹

在我們深入細節之前,讓我們先了解一下特殊變量是什麼。在Unix和Linux中,特殊變量是預定義的變量,它們包含關於shell環境和當前進程的特定信息。它們就像shell世界的秘密情報員,總是準備著關鍵的情報!

命令行參數

什麼是命令行參數?

命令行參數是在你運行腚本時提供給腚本的額外信息。它們就像在機器人開始任務前給予的指示。

讓我們看一個簡單的例子:

#!/bin/bash
echo "Hello, $1!"

如果我們將這個腚本保存為 greet.sh 並運行它,使用 ./greet.sh Alice,它將輸出:

Hello, Alice!

在這裡,$1 是一個特殊變量,代表第一個命令行參數。

使用多個參數

我們不限於只有一個參數。讓我們擴展我們的腚本:

#!/bin/bash
echo "Hello, $1! Welcome to $2."

現在,如果我們運行 ./greet.sh Alice Wonderland,我們會得到:

Hello, Alice! Welcome to Wonderland.

在這裡,$1 代表 "Alice",而 $2 代表 "Wonderland"。

變量 $0

還有一個值得提及的特殊變量:$0。這個變量代表腚本本身的名稱。讓我們修改我們的腚本:

#!/bin/bash
echo "This script is called $0"
echo "Hello, $1! Welcome to $2."

運行 ./greet.sh Alice Wonderland 現在輸出:

This script is called ./greet.sh
Hello, Alice! Welcome to Wonderland.

特殊參數 $* 和 $@

現在,讓我們來討論兩個非常有用的特殊參數:$*$@。這些就像命令行參數的動態二重奏!

變量 $*

$* 變量代表所有命令行參數作為一個字符串。它就像把所有參數放在一個籃子裡。這裡有一個例子:

#!/bin/bash
echo "All arguments using \$*: $*"

如果我們用 ./args.sh apple banana cherry 運行這個腚本,我們會得到:

All arguments using $*: apple banana cherry

變量 $@

$@ 變量與此相似,但它將每個參數視為一個獨立的實體。它就像把每個參數放在自己的小盒子裡。讓我們看看它是如何工作的:

#!/bin/bash
echo "All arguments using \$@:"
for arg in "$@"
do
echo $arg
done

使用 ./args.sh apple banana cherry 運行這個腚本會得到:

All arguments using $@:
apple
banana
cherry

變量 $* 和 $@ 的區別

你可能會想,"我看起來它們一樣啊!" 好吧,當我們在雙引號中使用它們時,區別就會變得明顯。讓我們創建一個腚本来演示:

#!/bin/bash
echo "Using \$*:"
for arg in "$*"
do
echo $arg
done

echo "Using \$@:"
for arg in "$@"
do
echo $arg
done

如果我們用 ./difference.sh "Hello World" OpenAI ChatGPT 運行這個腚本,我們會得到:

Using $*:
Hello World OpenAI ChatGPT

Using $@:
Hello World
OpenAI
ChatGPT

看到區別了嗎?"$*" 將所有參數視為一個字符串,而 "$@" 則保留個別參數。

終止狀態

最後但同樣重要的是,我們來討論終止狀態。在Unix和Linux中,每個命令在執行完畢後都會返回一個終止狀態。這個狀態是一個介於0到255之間的數字,其中0通常表示成功,而任何其他數字表示錯誤。

變量 $?

最後執行的命令的終止狀態存儲在 $? 變量中。讓我們看看它是如何工作的:

#!/bin/bash
ls /nonexistent_directory
echo "Exit status of ls command: $?"

echo "Hello, World!"
echo "Exit status of echo command: $?"

運行這個腚本可能會輸出:

ls: cannot access '/nonexistent_directory': No such file or directory
Exit status of ls command: 2
Hello, World!
Exit status of echo command: 0

ls 命令失敗(終止狀態2),而 echo 命令成功(終止狀態0)。

在腚本中使用終止狀態

我們可以使用終止狀態在腚本中做出決策。這裡有一個例子:

#!/bin/bash
ping -c 1 google.com > /dev/null

if [ $? -eq 0 ]
then
echo "Internet is working!"
else
echo "Internet is not working!"
fi

這個腚本ping Google一次並檢查終止狀態。如果是0(成功),則表示互聯網在工作。

結論

恭喜你們!你們剛剛在Unix/Linux編程旅程中邁出了很大的一步。這些特殊變量可能看起來很小,但它們是你編程工具包中非常強大的工具。記住,熟練才能完美,所以不要猶豫,在你自己的腚本中實驗這些概念。

這裡是我們討論過的特殊變量的快速參考表:

變量 描述
$0 腚本的名稱
$1, $2, ... 命令行參數
$* 所有參數作為一個字符串
$@ 所有參數作為分離的字符串
$? 最後命令的終止狀態

持續編碼,持續學習,最重要的是,玩得開心!直到下一次,快樂腚本!

Credits: Image by storyset