Unix / Linux - Biến Đặc Biệt

Xin chào các bạn đang học lập trình! Tôi rất vui mừng được làm hướng dẫn viên của bạn trong hành trình thú vị vào thế giới của các biến đặc biệt trong Unix và Linux. Là một ai đó đã dạy khoa học máy tính trong nhiều năm, tôi có thể đảm bảo rằng việc nắm vững các khái niệm này sẽ là một bước đột phá trong hành trình lập trình của bạn. Hãy cùng nhau khám phá nhé!

Unix / Linux - Special Variables

Giới Thiệu Về Biến Đặc Biệt

Trước khi chúng ta đi vào chi tiết, hãy hiểu về biến đặc biệt là gì. Trong Unix và Linux, các biến đặc biệt là các biến được xác định trước chứa thông tin cụ thể về môi trường shell và tiến trình hiện tại. Chúng giống như những điệp viên trong thế giới shell, luôn sẵn sàng với những thông tin quan trọng!

Các Tham Số Command-Line

Command-Line Arguments Là Gì?

Các tham số command-line là những thông tin bổ sung bạn cung cấp cho một script khi bạn chạy nó. Chúng giống như việc đưa ra các hướng dẫn cho một robot trước khi nó bắt đầu nhiệm vụ.

Hãy xem một ví dụ đơn giản:

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

Nếu chúng ta lưu script này với tên greet.sh và chạy nó với ./greet.sh Alice, nó sẽ hiển thị:

Hello, Alice!

Ở đây, $1 là một biến đặc biệt đại diện cho tham số command-line đầu tiên.

Sử Dụng Nhiều Tham Số

Chúng ta không chỉ giới hạn ở một tham số. Hãy mở rộng script của chúng ta:

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

Bây giờ, nếu chúng ta chạy ./greet.sh Alice Wonderland, chúng ta sẽ nhận được:

Hello, Alice! Welcome to Wonderland.

Ở đây, $1 đại diện cho "Alice" và $2 đại diện cho "Wonderland".

Biến $0

Có một biến đặc biệt khác đáng nhắc đến: $0. Biến này đại diện cho tên của script本身的. Hãy chỉnh sửa script của chúng ta:

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

Chạy ./greet.sh Alice Wonderland bây giờ sẽ hiển thị:

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

Các Tham Số Đặc Biệt $* và $@

Bây giờ, hãy nói về hai tham số đặc biệt rất hữu ích: $*$@. Đây giống như đôi bạn đồng hành của các tham số command-line!

Tham Số $*

Tham số $* đại diện cho tất cả các tham số command-line như một chuỗi duy nhất. Nó giống như việc đặt tất cả các tham số của bạn vào một giỏ. Dưới đây là một ví dụ:

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

Nếu chúng ta chạy script này với ./args.sh apple banana cherry, chúng ta sẽ nhận được:

All arguments using $*: apple banana cherry

Tham Số $@

Tham số $@ tương tự, nhưng nó coi mỗi tham số là một thực thể riêng biệt. Nó giống như việc giữ mỗi tham số trong một hộp nhỏ. Hãy xem nó trong hành động:

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

Chạy này với ./args.sh apple banana cherry sẽ cho:

All arguments using $@:
apple
banana
cherry

Sự Khác Biệt Giữa $* và $@

Bạn có thể tự hỏi, "Chúng trông alike với tôi!" Well, sự khác biệt trở nên rõ ràng khi chúng ta sử dụng chúng trong dấu ngoặc kép. Hãy tạo một script để minh họa:

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

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

Nếu chúng ta chạy này với ./difference.sh "Hello World" OpenAI ChatGPT, chúng ta sẽ nhận được:

Using $*:
Hello World OpenAI ChatGPT

Using $@:
Hello World
OpenAI
ChatGPT

Thấy sự khác biệt chưa? "$*" coi tất cả các tham số như một chuỗi duy nhất, trong khi "$@" giữ lại các tham số riêng lẻ.

Trạng Thái Thoát

Cuối cùng, hãy nói về trạng thái thoát. Trong Unix và Linux, mỗi lệnh trả về một trạng thái thoát khi kết thúc việc thực thi. Trạng thái này là một số từ 0 đến 255, nơi 0 thường có nghĩa là thành công, và bất kỳ số nào khác cho thấy một lỗi.

Biến $?

Trạng thái thoát của lệnh cuối cùng được lưu trữ trong biến $?. Hãy xem nó trong hành động:

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

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

Chạy script này có thể hiển thị:

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

Lệnh ls thất bại (trạng thái thoát 2), trong khi lệnh echo thành công (trạng thái thoát 0).

Sử Dụng Trạng Thái Thoát Trong Scripts

Chúng ta có thể sử dụng trạng thái thoát để ra quyết định trong script của mình. Dưới đây là một ví dụ:

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

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

Script này ping Google một lần và kiểm tra trạng thái thoát. Nếu nó là 0 (thành công), nó có nghĩa là internet đang hoạt động.

Kết Luận

Chúc mừng! Bạn vừa bước ra một bước lớn trong hành trình lập trình Unix/Linux của mình. Các biến đặc biệt này có thể nhỏ, nhưng chúng là những công cụ mạnh mẽ trong bộ công cụ lập trình của bạn. Nhớ rằng, thực hành là cách để thành thạo, vì vậy đừng ngần ngại thử nghiệm các khái niệm này trong script của riêng bạn.

Dưới đây là bảng tham khảo nhanh của các biến đặc biệt chúng ta đã đề cập:

Biến Mô Tả
$0 Tên của script
$1, $2, ... Tham số command-line
$* Tất cả các tham số như một chuỗi duy nhất
$@ Tất cả các tham số như các chuỗi riêng lẻ
$? Trạng thái thoát của lệnh cuối cùng

Tiếp tục lập trình, tiếp tục học hỏi, và quan trọng nhất, hãy vui vẻ! Đến gặp lại lần sau, chúc các bạn viết script vui vẻ!

Credits: Image by storyset