2.1 Bài 2
Chứng chỉ: |
Linux Essentials |
---|---|
Phiên bản: |
1.6 |
Chủ đề: |
2 Tìm đường trong Hệ thống Linux |
Mục tiêu: |
2.1 Những khái niệm cơ bản về Dòng lệnh |
Bài: |
2 trên 2 |
Giới thiệu
Tất cả các vỏ đều quản lý một tập hợp các thông tin trạng thái trong suốt các phiên làm việc của nó. Những thông tin thời gian chạy này có thể thay đổi trong phiên làm việc và ảnh hưởng đến cách hoạt động của vỏ. Dữ liệu này cũng được các chương trình sử dụng để xác định các khía cạnh của cấu hình hệ thống. Hầu hết những dữ liệu này sẽ được lưu trữ trong cái được gọi là biến mà chúng ta sẽ đề cập tới trong bài học này.
Biến
Biến là các phần lưu trữ dữ liệu, chẳng hạn như văn bản hoặc số liệu. Một khi được thiết lập, giá trị của một biến có thể được truy cập sau đó. Mỗi biến đều có một cái tên để truy cập cụ thể, ngay cả khi nội dung của biến đó thay đổi. Đây là một công cụ rất phổ biến trong hầu hết các ngôn ngữ lập trình.
Có hai loại biến trong hầu hết các vỏ Linux:
- Biến cục bộ
-
Các biến này chỉ khả dụng cho quá trình vỏ hiện tại. Nếu bạn tạo một biến cục bộ và sau đó bắt đầu một chương trình khác từ vỏ này, biến đó sẽ không thể truy cập được bởi chương trình đó nữa. Bởi các quy trình con không kế thừa chúng nên các biến này được gọi là biến cục bộ.
- Biến môi trường
-
Các biến này có sẵn trong cả một phiên vỏ cụ thể lẫn trong các quy trình con được sinh ra từ phiên vỏ đó. Chúng có thể được sử dụng để truyền dữ liệu cấu hình cho các lệnh đang chạy. Vì các chương trình này có thể truy cập các biến này nên chúng được gọi là biến môi trường. Phần lớn các biến môi trường sẽ được viết bằng chữ in hoa (ví dụ như
PATH
,DATE
,USER
). Ví dụ, một tập hợp các biến môi trường mặc định sẽ cung cấp thông tin về thư mục chính của người dùng hoặc loại cửa sổ dòng lệnh. Đôi khi một tập hợp đầy đủ tất cả các biến môi trường còn được gọi là môi trường.
Note
|
Các biến sẽ không có mãi. Khi vỏ chứa chúng được đóng lại, tất cả các biến và nội dung của chúng sẽ bị mất. Hầu hết các vỏ đều sẽ cung cấp các tệp cấu hình có chứa các biến được thiết lập bất cứ khi nào một vỏ mới được khởi động. Những biến cần phải được thiết lập vĩnh viễn phải được thêm vào một trong những tệp cấu hình này. |
Thao tác với Biến
Là quản trị viên hệ thống, bạn sẽ cần thao tác tạo, sửa đổi hoặc xóa cả biến cục bộ lẫn biến môi trường.
Làm việc với Biến Cục bộ
Bạn có thể thiết lập một biến cục bộ bằng cách sử dụng toán tử =
(dấu bằng). Một phép gán đơn giản sẽ tạo ra được một biến cục bộ:
$ greeting=hello
Note
|
Không đặt bất kỳ khoảng trắng nào trước hoặc sau toán tử |
Bạn có thể hiển thị bất kỳ biến nào bằng lệnh echo
. Lệnh này thường sẽ hiển thị văn bản trong phần đối số:
$ echo greeting greeting
Để truy cập giá trị của biến, bạn sẽ cần sử dụng $
(ký hiệu đô la) trước tên của biến.
$ echo $greeting hello
Như có thể thấy, biến đã được tạo. Bây giờ, hãy mở một vỏ khác và thử hiển thị nội dung của biến đã tạo.
$ echo $greeting
Không có gì được hiển thị. Từ đây ta có thể hiểu là các biến luôn chỉ tồn tại trong một vỏ cụ thể.
Để xác minh rằng biến đó thực sự là một biến cục bộ, hãy thử tạo một quy trình mới và kiểm tra xem quy trình này có thể truy cập biến đó hay không. Chúng ta có thể làm việc này bằng cách khởi động một vỏ khác và để vỏ này chạy lệnh echo
. Vì vỏ mới được chạy trong một quy trình mới nên nó sẽ không kế thừa các biến cục bộ từ quy trình mẹ của nó:
$ echo $greeting world hello world $ bash -c 'echo $greeting world' world
Note
|
Hãy nhớ sử dụng trích dẫn đơn trong ví dụ trên. |
Để xóa một biến, bạn sẽ cần sử dụng lệnh unset
:
$ echo $greeting hey $ unset greeting $ echo $greeting
Note
|
|
Làm việc với Biến Toàn cục
Để cung cấp một biến cho các quy trình con, hãy biến biến đó từ biến cục bộ thành biến môi trường. Điều này có thể được thực hiện bằng lệnh export
. Khi nó được gọi với tên biến, biến này sẽ được thêm vào môi trường của vỏ:
$ greeting=hello $ export greeting
Note
|
Một lần nữa, hãy nhớ không sử dụng |
Một cách dễ hơn để tạo biến môi trường là kết hợp cả hai phương pháp trên bằng cách gán giá trị của biến vào phần đối số của lệnh.
$ export greeting=hey
Hãy kiểm tra lại xem biến có thể truy cập được trong các quy trình con hay không:
$ export greeting=hey $ echo $greeting world hey world $ bash -c 'echo $greeting world' hey world
Một cách khác để sử dụng các biến môi trường là sử dụng chúng trước các lệnh. Chúng ta có thể kiểm tra điều này với biến môi trường TZ
chứa múi giờ. Biến này có thể được sử dụng bởi lệnh date
để xác định thời gian của múi giờ sẽ hiển thị:
$ TZ=EST date Thu 31 Jan 10:07:35 EST 2019 $ TZ=GMT date Thu 31 Jan 15:07:35 GMT 2019
Bạn có thể hiển thị tất cả các biến môi trường bằng lệnh env
.
Biến PATH
Biến PATH
là một trong những biến môi trường quan trọng nhất trong hệ thống Linux. Nó lưu trữ một danh sách các thư mục (được phân tách bằng dấu hai chấm) có chứa các chương trình có thể thực thi và đủ điều kiện để trở thành lệnh từ vỏ Linux.
$ echo $PATH /home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Để thêm một thư mục mới vào biến, bạn sẽ cần sử dụng dấu hai chấm (:
).
$ PATH=$PATH:new_directory
Sau đây là một ví dụ:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $ PATH=$PATH:/home/user/bin $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin
Như bạn thấy, $PATH
được sử dụng trong giá trị mới được gán cho PATH
. Biến này được giải quyết trong quá trình thực thi lệnh và sẽ đảm bảo rằng nội dung ban đầu của biến được giữ nguyên. Tất nhiên, bạn cũng có thể sử dụng các biến khác trong quá trình gán:
$ mybin=/opt/bin $ PATH=$PATH:$mybin $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin:/opt/bin
Biến PATH
cần được xử lý một cách thận trọng vì nó rất quan trọng trong quá trình làm việc trên dòng lệnh. Hãy xem xét biến PATH
sau:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Để tìm hiểu cách vỏ gọi một lệnh cụ thể như thế nào, bạn có thể chạy lệnh which
với tên của lệnh làm đối số. Ví dụ, chúng ta có thể thử tìm ra nơi nano
được lưu trữ:
$ which nano /usr/bin/nano
Như có thể thấy, tệp thực thi nano
nằm trong thư mục /usr/bin
. Hãy xóa thư mục khỏi biến và kiểm tra xem lệnh có còn hoạt động hay không:
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games
Hãy tra cứu lại lệnh nano
một lần nữa:
$ which nano which: no nano in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/bin:/usr/games)
Như bạn có thể thấy, lệnh không được tìm thấy, do đó không được thực thi. Thông báo lỗi cũng giải thích lý do tại sao lệnh không được tìm thấy và nó đã được tìm kiếm ở những vị trí nào.
Hãy thêm lại các thư mục và thử chạy lại lệnh.
$ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin $ which nano /usr/bin/nano
Bây giờ lệnh đã hoạt động trở lại.
Tip
|
Thứ tự của các thành phần trong |
Bài tập Hướng dẫn
-
Hãy tạo một biến cục bộ
number
. -
Hãy tạo một biến môi trường
ORDER
, sử dụng một trong hai phương pháp trên. -
Hãy hiển thị cả tên biến và nội dung của chúng.
-
Phạm vi của các biến được tạo trước đó là gì?
Bài tập Mở rộng
-
Hãy tạo một biến cục bộ
nr_files
và gán số dòng tìm thấy trong tệp/etc/passwd
. Gợi ý: Xem lệnhwc
và phép thay thế lệnh. Đừng quên dấu trích dẫn kép. -
Hãy tạo một biến môi trường
ME
và gán giá trị của biếnUSER
cho nó. -
Hãy nối giá trị của biến
HOME
vàoME
có chứa dấu phân tách:
. Hãy hiển thị nội dung của biếnME
. -
Sử dụng ví dụ về ngày ở trên, hãy tạo một biến có tên
today
(hôm nay) và gán ngày cho một trong các múi giờ. -
Hãy tạo một biến khác có tên
today1
và gán ngày của hệ thống cho biến đó.
Tóm tắt
Trong bài học này, bạn đã học về:
-
Các loại biến
-
Cách tạo biến
-
Cách thao tác với các biến
Các lệnh được dùng trong bài tập:
env
-
Hiển thị môi trường hiện tại.
echo
-
Xuất văn bản.
export
-
Cung cấp các biến cục bộ cho các quy trình con.
unset
-
Loại bỏ một biến.
Đáp án Bài tập Hướng dẫn
-
Hãy tạo một biến cục bộ
number
.$ number=5
-
Hãy tạo một biến môi trường
ORDER
, sử dụng một trong hai phương pháp trên.$ export ORDER=desc
-
Hãy hiển thị cả tên biến và nội dung của chúng.
$ echo number number $ echo ORDER ORDER $ echo $number 5 $ echo $ORDER desc
-
Phạm vi của các biến được tạo trước đó là gì?
-
Phạm vi của biến cục bộ
number
chỉ là vỏ hiện tại. -
Phạm vi của biến môi trường
ORDER
là vỏ hiện tại và tất cả các vỏ con được tạo từ nó.
-
Đáp án Bài tập Mở rộng
-
Hãy tạo một biến cục bộ
nr_files
và gán số dòng tìm thấy trong tệp/etc/passwd
. Gợi ý: Xem lệnhwc
và phép thay thế lệnh. Đừng quên dấu trích dẫn kép.$ nr_files=`wc -l /etc/passwd`
-
Hãy tạo một biến môi trường
ME
và gán giá trị của biếnUSER
cho nó.$ export ME=$USER
-
Hãy nối giá trị của biến
HOME
vàoME
có chứa dấu phân tách:
. Hãy hiển thị nội dung của biếnME
.$ ME=$ME:$HOME $ echo $ME user:/home/user
-
Sử dụng ví dụ về ngày ở trên, hãy tạo một biến có tên
today
(hôm nay) và gán ngày cho một trong các múi giờ.Phần sau sử dụng múi giờ GMT và EST làm ví dụ, nhưng mọi lựa chọn múi giờ đều sẽ hợp lệ.
$ today=$(TZ=GMT date) $ echo $today Thu 31 Jan 15:07:35 GMT 2019
hoặc
$ today=$(TZ=EST date) $ echo $today Thu 31 Jan 10:07:35 EST 2019
-
Hãy tạo một biến khác có tên
today1
và gán ngày của hệ thống cho biến đó.Giả sử rằng bạn đang ở múi giờ GMT:
$ today1=$(date) $ echo $today1 Thu 31 Jan 10:07:35 EST 2019