Trong khoa học máy tính (và tin học thông thường), một biến là vị trí trong bộ nhớ chứa thông tin tùy ý để dùng sau. Nói cách khác, đó là vùng nhớ tạm để bạn đưa dữ liệu vào và lấy ra. Trong shell Bash, dữ liệu đó có thể là từ (một chuỗi, thuật ngữ máy tính) hoặc 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 chắc chắn đã dùng biến trong lĩnh vực khác. Khi nói "cho tôi cái đó" hoặc "nhìn cái này", bạn dùng biến ngữ pháp (nghĩ đến như đại từ nhân xưng). Ý nghĩa "cái này" và "cái đó" phụ thuộc vào gì bạn hình dung trong đầu, hoặc gì bạn chỉ để khán giả biết bạn đề cập gì. Khi làm toán, bạn dùng biến đại diện giá trị chưa biết, dù không gọi chúng là biến.
Bài viết này nói về biến trong PowerShell, chạy trên Windows, Linux, Mac. Người dùng Bash mã nguồn mở nên tham khảo bài biến Bash của tôi (dù bạn có thể chạy PowerShell trên Linux, nó mã nguồn mở, nên vẫn có thể theo dõi).
Lưu ý: Ví dụ trong bài từ phiên PowerShell chạy trên Linux mã nguồn mở, nên nếu bạn trên Windows/Mac đường dẫn file khác. Tuy nhiên, Windows tự chuyển / sang \, và mọi ví dụ chạy đa nền tảng, miễn thay thế sự khác biệt rõ ràng (ví dụ, không có khả năng username là seth).
Biến dùng làm gì?
Việc bạn cần biến trong PowerShell phụ thuộc vào việc bạn làm trong terminal. Với một số người, biến là phương tiện thiết yếu quản lý dữ liệu, với người khác chỉ tiện ích nhỏ tạm thời, hoặc với một số, chúng có vẻ không tồn tại.
Cuối cùng, biến là công cụ. Bạn dùng khi thấy cần, hoặc để chúng yên nghỉ trong sự an tâm biết chúng được quản lý bởi OS. 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 đến giải pháp sáng tạo bất ngờ.
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, dùng, và nói chung vô hại. Trong PowerShell, bạn tạo biến bằng cách định nghĩa tên biến rồi đặt giá trị với lệnh Set-Variable. Ví dụ dưới tạo biến FOO gán chuỗi $HOME/Documents:
PS> Set-Variable -Name FOO -Value "$HOME/Documents"
Thành công lặng lẽ đến mức bạn có thể không tự tin biến đã đặt. Bạn tự kiểm tra bằng lệnh Get-Variable (gv viết tắt). Để đảm bảo biến đọc chính xác như định nghĩa, cũng có thể bọc trong ngoặc kép. Việc này bảo toàn ký tự đặc biệt có thể xuất hiện; ví dụ này không áp dụng, nhưng thói quen tốt:
PS> Get-Variable "FOO" -valueOnly
/home/seth/Documents
Chú ý nội dung FOO không chính xác thứ bạn đặt. Chuỗi literal bạn đặt cho biến là $HOME/Documents, nhưng giờ hiển thị /home/seth/Documents. Điều này xảy ra vì bạn có thể lồng biến. Biến $HOME trỏ đến thư mục home người dùng hiện tại, dù C:\Users Windows, /home Linux, hoặc /Users Mac. Vì $HOME nhúng trong FOO, biến đó được mở rộng khi gọi lại. Dùng biến mặc định cách này giúp viết script di động chạy đa nền tảng.
Biến thường nhằm truyền thông tin từ hệ thống này sang hệ thống khác. Ví dụ đơn giản này biến không quá hữu ích, nhưng vẫn truyền thông tin. Ví dụ, vì nội dung FOO là đường dẫn file, bạn dùng FOO làm tắt đến thư mục giá trị tham chiếu.
Để tham chiếu nội dung biến FOO chứ không phải biến bản thân, thêm dấu đô la ($) trước:
PS> pwd
/home/seth
PS> cd "$FOO"
PS> pwd
/home/seth/Documents
Xóa biến
Bạn có thể xóa biến với lệnh Remove-Variable:
PS> Remove-Variable -Name "FOO"
PS> gv "FOO"
gv : Cannot find a variable with the name 'FOO'.
[...]
Trong thực tế, xóa biến thường không cần. Biến khá "rẻ", nên bạn tạo và quên khi không cần. Tuy nhiên, có lúc bạn muốn đảm bảo biến rỗng để tránh truyền thông tin không mong muốn cho tiến trình khác đọ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 biến đã được đặt bởi bạn hoặc tiến trình khác. Nếu không muốn ghi đè, bạn có thể dùng New-Variable, thiết kế thất bại nếu biến cùng tên đã tồn tại, hoặc dùng câu lệnh điều kiện kiểm tra biến trước:
PS> New-Variable -Name FOO -Value "example"
New-Variable : A variable with name 'FOO' already exists.
Lưu ý: Trong ví dụ này, giả sử FOO đặt thành /home/seth/Documents.
Thay vào đó, bạn có thể xây if đơn giản kiểm tra biến tồn tại:
PS> if ( $FOO )
>> { gv FOO } else
>> { Set-Variable -Name "FOO" -Value "quux" }
Thêm vào biến
Thay vì ghi đè biến, bạn có thể thêm vào biến hiện có. Trong PowerShell, biến có kiểu đa dạng: chuỗi, số nguyên, mảng. Khi chọn tạo biến về cơ bản có nhiều giá trị, bạn phải quyết định cần chuỗi phân cách ký tự hay mảng. Bạn có thể không quan tâm, nhưng ứng dụng nhận dữ liệu biến có thể kỳ vọng cái này hoặc cái kia, nên chọn dựa trên mục tiêu.
Để nối dữ liệu vào biến chuỗi, dùng cú pháp +=:
PS> gv FOO
foo
PS> $FOO += ",bar"
PS> gv FOO
foo,bar
PS> $FOO.getType().Name
String
Mảng là kiểu biến đặc biệt PowerShell và yêu cầu đối tượng ArrayList. Đó nằm ngoài phạm vi bài, vì yêu cầu đi sâu vào nội tại .NET của PowerShell.
Toàn cục với biến môi trường
Cho đến nay biến tạo trong bài là cục bộ, nghĩa là chỉ áp dụng cho phiên PowerShell bạn tạo. Để tạo biến truy cập được bởi tiến trình khác, bạn tạo biến môi trường, sẽ đề cập trong bài sau.