Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Thành Thạo Biến Bash: Khai Báo, Gán Và Sử Dụng Hiệu Quả

Trong khoa học máy tính (và tin học thông thường), một biến là một vị trí trong bộ nhớ chứa thông tin tùy ý để sử dụng sau. Nói cách khác, đó là một vùng nhớ tạm thời để bạn đưa dữ liệu vào và lấy dữ liệu ra. Trong shell Bash, dữ liệu đó có thể là một từ (một chuỗi, theo thuật ngữ máy tính) hoặc một số (một số nguyên).

Bạn có thể chưa bao giờ (có ý thức) dùng biến trên máy tính, nhưng bạn chắc chắn đã dùng biến trong các lĩnh vực khác của cuộc sống. Khi bạn nói "cho tôi cái đó" hoặc "nhìn cái này", bạn đang dùng biến ngữ pháp (bạn nghĩ đến chúng như đại từ nhân xưng), vì ý nghĩa của "cái này" và "cái đó" phụ thuộc vào bất cứ gì bạn đang hình dung trong đầu, hoặc bất cứ gì bạn đang chỉ để khán giả biết bạn đang đề cập đến gì. Khi làm toán, bạn dùng biến để đại diện cho giá trị chưa biết, dù bạn có thể không gọi nó là biến.

Dưới đây là demo nhanh và dễ hiểu về một biến Bash bạn có thể không nhận ra mình dùng hàng ngày. Biến PS1 giữ thông tin về cách bạn muốn dấu nhắc terminal hiển thị. Ví dụ, bạn có thể đặt nó thành thứ rất đơn giản—như dấu phần trăm (%)—bằng cách định nghĩa lại biến PS1:

$ PS1="% "
%

Bài viết này nói về biến trong shell Bash chạy trên Linux, BSD, Mac, hoặc Cygwin. Người dùng PowerShell mã nguồn mở của Microsoft nên tham khảo bài viết của tôi về biến trong PowerShell.

Biến dùng để làm gì?

Việc bạn có cần biến trong Bash hay không phụ thuộc vào những gì bạn làm trong terminal. Đối với một số người, biến là phương tiện thiết yếu để quản lý dữ liệu, còn với người khác chúng chỉ là tiện ích nhỏ và tạm thời, và với những người khác nữa, chúng có vẻ như không tồn tại.

Cuối cùng, biến là một công cụ. Bạn có thể dùng chúng khi thấy cần thiết, hoặc để chúng yên nghỉ trong sự an tâm biết rằng chúng được quản lý bởi hệ điều hành. Kiến thức là sức mạnh, và hiểu cách biến hoạt động trong Bash có thể dẫn bạn đến những giải pháp sáng tạo bất ngờ.

Cách thiết lập biến

Bạn không cần quyền đặc biệt để tạo biến. Chúng miễn phí tạo, miễn phí dùng, và nói chung vô hại. Trong shell Bash (trên Linux và Mac), bạn có thể thiết lập chúng bằng cách định nghĩa tên biến, sau đó gán giá trị. Ví dụ sau tạo biến mới gọi là FOO và gán giá trị là chuỗi /home/seth/Documents:

$ declare FOO="/home/seth/Documents"

Thành công lặng lẽ đến mức bạn có thể không tự tin rằng biến đã được thiết lập. Bạn có thể tự kiểm tra bằng lệnh echo, gọi lại biến bằng cách thêm dấu đô la ($) ở đầu. Để đảm bảo biến được đọc chính xác như bạn định nghĩa, bạn cũng có thể bọc nó trong ngoặc nhọn và ngoặc kép. Việc này bảo toàn mọi ký tự đặc biệt có thể xuất hiện trong biến; trong ví dụ này không áp dụng, nhưng đây vẫn là thói quen tốt:

$ echo "${FOO}"
/home/seth/Documents

Việc thiết lập biến có thể là điều phổ biến đối với người thường dùng shell, nên quy trình đã trở nên khá không chính thức. Khi một chuỗi theo sau là dấu bằng (=) và một giá trị, Bash mặc định ngầm hiểu bạn đang thiết lập biến, làm cho từ khóa declare trở nên không cần thiết:

$ FOO="/home/seth/Documents"

Biến thường nhằm truyền thông tin từ hệ thống này sang hệ thống khác. Trong ví dụ đơn giản này, biến của bạn không quá hữu ích, nhưng nó vẫn có thể truyền thông tin. Ví dụ, vì nội dung biến FOO là đường dẫn file, bạn có thể dùng biến làm tắt đến thư mục ~/Documents:

$ pwd
/home/seth
$ cd "${FOO}"
$ pwd
/home/seth/Documents

Biến có thể là bất kỳ chuỗi không phải từ khóa dành riêng (cùng với số nguyên và gạch dưới). Chúng không bắt buộc phải viết hoa, nhưng thường viết hoa để dễ nhận diện là biến.

Cách xóa biến

Bạn có thể xóa biến bằng lệnh unset:

$ unset FOO
$ echo $FOO

Trong thực tế, hành động này thường không cần thiết. Biến khá "rẻ", nên bạn có thể tạo chúng và quên đi khi không cần nữa. Tuy nhiên, có thể có lúc bạn muốn đảm bảo biến rỗng để tránh truyền thông tin sai cho tiến trình khác có thể đọc biến đó.

Tạo biến mới với bảo vệ chống ghi đè

Đôi khi, bạn có lý do tin rằng một biến đã được thiết lập bởi bạn hoặc một tiến trình. Nếu bạn không muốn ghi đè nó, có một cú pháp đặc biệt để đặt biến về giá trị hiện có trừ khi giá trị đó rỗng.

Cho ví dụ này, giả sử FOO đã được đặt thành /home/seth/Documents:

$ FOO=${FOO:-"bar"}
$ echo $FOO
/home/seth/Documents

Ký hiệu hai chấm gạch ngang :- khiến declare mặc định về giá trị hiện có. Để thấy quá trình này hoạt động ngược lại, hãy xóa biến, và thử lại:

$ unset FOO
$ echo $FOO

$ FOO=${FOO:-"bar"}
$ echo $FOO
bar

Truyền biến cho tiến trình con

Khi bạn tạo một biến, bạn đang tạo ra cái gọi là biến cục bộ. Điều này có nghĩa là biến chỉ được biết đến bởi shell hiện tại của bạn và chỉ shell hiện tại đó.

Thiết lập này là một giới hạn có chủ đích của phạm vi biến. Biến, theo thiết kế, xu hướng mặc định chỉ có sẵn cục bộ, nhằm giữ việc chia sẻ thông tin trên cơ sở cần biết. Nếu bạn ngu ngốc tạo một biến chứa mật khẩu quan trọng dưới dạng văn bản thuần túy, ví dụ, thì tốt là biết rằng hệ thống sẽ không cho phép shell từ xa hoặc daemon giả mạo (hoặc bất cứ thứ gì bên ngoài phiên tạo biến) truy cập mật khẩu đó.

Dùng ví dụ từ đầu bài để thay đổi dấu nhắc, nhưng sau đó khởi chạy shell mới bên trong shell hiện tại:

$ PS1="% "
% bash
$

Khi khởi chạy shell mới, giá trị mới của PS1 trở thành dấu nhắc mặc định thay vì dấu nhắc tùy chỉnh của bạn: Tiến trình con không kế thừa biến được thiết lập trong tiến trình cha. Nếu bạn kill tiến trình con, bạn quay lại shell cha, và thấy lại dấu nhắc PS1 tùy chỉnh:

$ exit
%

Nếu bạn muốn truyền biến cho tiến trình con, bạn có thể thêm tiền tố trước lệnh bằng định nghĩa biến, hoặc export biến cho tiến trình con.

Thêm tiền tố biến

Bạn có thể thêm bất kỳ số lượng biến nào trước khi chạy lệnh. Cho dù biến có được tiến trình con sử dụng hay không tùy thuộc vào tiến trình đó, nhưng bạn có thể truyền biến cho nó bất kể:

$ FOO=123 bash
$ echo $FOO
123
$

Thêm tiền tố có thể là thủ thuật hữu ích khi bạn chạy ứng dụng yêu cầu vị trí đặc biệt cho thư viện nhất định (dùng biến LD_LIBRARY_PATH), hoặc khi biên dịch phần mềm với trình biên dịch không chuẩn (dùng biến CC), v.v.

Xuất biến (export)

Cách khác để làm cho biến có sẵn cho tiến trình con là từ khóa export, một lệnh tích hợp sẵn trong Bash. Lệnh export mở rộng phạm vi của bất kỳ biến nào bạn chỉ định:

$ PS1="% "
$ FOO=123
$ export PS1
$ export FOO
% bash
% echo $PS1
%
% echo $FOO
123

Trong cả hai trường hợp, không chỉ shell con mới có quyền truy cập biến cục bộ đã được truyền hoặc xuất, mà là bất kỳ tiến trình con nào của shell đó. Bạn có thể khởi chạy ứng dụng từ cùng shell đó, và biến đó có sẵn như biến môi trường từ bên trong ứng dụng.

Biến được xuất để mọi thứ trên hệ thống sử dụng được gọi là biến môi trường, là chủ đề cho bài viết sau. Trong lúc chờ đợi, hãy thử dùng một số biến cho tác vụ hàng ngày để xem chúng mang lại gì cho quy trình làm việc của bạn.