Cách làm việc với các biến trong Bash
Các biến rất quan trọng nếu bạn muốn viết tập lệnh và hiểu mã bạn sắp cắt và dán từ web sẽ làm gì với máy tính Linux của bạn. Chúng tôi sẽ giúp bạn bắt đầu!
Các biến số 101
Các biến là các ký hiệu được đặt tên đại diện cho một chuỗi hoặc giá trị số. Khi bạn sử dụng chúng trong các lệnh và biểu thức, chúng được coi như thể bạn đã nhập giá trị mà chúng giữ thay vì tên của biến.
Để tạo một biến, bạn chỉ cần cung cấp tên và giá trị cho nó. Tên biến của bạn phải mang tính mô tả và nhắc nhở bạn về giá trị mà chúng nắm giữ. Tên biến không được bắt đầu bằng số, cũng như không được chứa khoảng trắng. Tuy nhiên, nó có thể bắt đầu bằng dấu gạch dưới. Ngoài ra, bạn có thể sử dụng bất kỳ kết hợp ký tự chữ và số viết hoa và viết thường nào.
Các ví dụ
Ở đây, chúng tôi sẽ tạo năm biến. Định dạng là gõ tên, dấu bằng =
và giá trị. Lưu ý rằng không có khoảng trắng trước hoặc sau dấu bằng. Cung cấp cho một biến một giá trị thường được gọi là phân công một giá trị cho biến.
Chúng tôi sẽ tạo bốn biến chuỗi và một biến số,Năm nay:
tôi = Dave
my_boost = Linux
anh ấy = Popeye
his_boost = Rau bina
this_year = 2019
Để xem giá trị được giữ trong một biến, hãy sử dụng tiếng vọng lại
chỉ huy. Bạn phải đặt trước tên biến bằng một ký hiệu đô la $
bất cứ khi nào bạn tham chiếu giá trị mà nó chứa, như được hiển thị bên dưới:
echo $ my_name
echo $ my_boost
echo $ this_year
Hãy sử dụng tất cả các biến của chúng tôi cùng một lúc:
echo "$ my_boost là với $ me vì $ his_boost là với $ him (c) $ this_year"
Giá trị của các biến thay thế tên của chúng. Bạn cũng có thể thay đổi giá trị của các biến. Để gán một giá trị mới cho biến,my_boost
, bạn chỉ cần lặp lại những gì bạn đã làm khi chỉ định giá trị đầu tiên của nó, như sau:
my_boost = Tequila
Nếu bạn chạy lại lệnh trước đó, bây giờ bạn sẽ nhận được một kết quả khác:
echo "$ my_boost là với $ me vì $ his_boost là với $ him (c) $ this_year"
Vì vậy, bạn có thể sử dụng cùng một lệnh tham chiếu đến các biến giống nhau và nhận được các kết quả khác nhau nếu bạn thay đổi các giá trị được giữ trong các biến.
Chúng ta sẽ nói về việc trích dẫn các biến sau. Hiện tại, đây là một số điều cần nhớ:
- Một biến trong dấu ngoặc kép
'
được coi là một chuỗi ký tự chứ không phải là một biến. - Các biến trong dấu ngoặc kép
"
được coi là các biến. - Để nhận giá trị được giữ trong một biến, bạn phải cung cấp ký hiệu đô la
$
. - Một biến không có ký hiệu đô la
$
chỉ cung cấp tên của biến.
Bạn cũng có thể tạo một biến lấy giá trị của nó từ một biến hoặc một số biến hiện có. Lệnh sau định nghĩa một biến mới được gọi là drink_of_the_Year,
và gán cho nó các giá trị kết hợp của my_boost
và Năm nay
biến:
drink_of-the_Year = "$ my_boost $ this_year"
echo drink_of_the-Year
Cách sử dụng các biến trong tập lệnh
Các tập lệnh sẽ hoàn toàn không hoạt động nếu không có biến. Các biến cung cấp tính linh hoạt khiến tập lệnh trở thành một giải pháp chung, thay vì một giải pháp cụ thể. Để minh họa sự khác biệt, đây là một tập lệnh đếm các tệp trong / dev
danh mục.
Nhập tệp này vào tệp văn bản, sau đó lưu dưới dạng fcnt.sh
(đối với "số lượng tệp"):
#! / bin / bash folder_to_count = / dev file_count = $ (ls $ folder_to_count | wc -l) echo $ file_count tệp trong $ folder_to_count
Trước khi bạn có thể chạy tập lệnh, bạn phải làm cho nó có thể thực thi được, như được hiển thị bên dưới:
chmod + x fcnt.sh
Nhập thông tin sau để chạy tập lệnh:
./fcnt.sh
Điều này in số lượng tệp trong / dev
danh mục. Đây là cách nó hoạt động:
- Một biến được gọi là
folder_to_count
được xác định và nó được đặt để giữ chuỗi “/ dev”. - Một biến khác, được gọi là
file_count
, được định nghĩa. Biến này nhận giá trị của nó từ một lệnh thay thế. Đây là cụm từ lệnh nằm giữa dấu ngoặc đơn$( )
. Lưu ý rằng có một ký hiệu đô la$
trước dấu ngoặc đơn đầu tiên. Cấu trúc này$( )
đánh giá các lệnh trong dấu ngoặc đơn, sau đó trả về giá trị cuối cùng của chúng. Trong ví dụ này, giá trị đó được gán chofile_count
Biến đổi. Xa nhưfile_count
biến có liên quan, nó đã được chuyển một giá trị để giữ; nó không quan tâm đến cách thu được giá trị. - Lệnh được đánh giá trong phép thay thế lệnh thực hiện một
ls
danh sách tệp trên thư mục trongfolder_to_count
biến, đã được đặt thành “/ dev.” Vì vậy, tập lệnh thực hiện lệnh “ls / dev.” - Đầu ra từ lệnh này được đưa vào
wc
chỉ huy. Các-l
(số dòng) nguyên nhân tùy chọnwc
để đếm số dòng trong đầu ra từls
chỉ huy. Vì mỗi tệp được liệt kê trên một dòng riêng biệt, đây là số tệp và thư mục con trong thư mục “/ dev”. Giá trị này được gán chofile_count
Biến đổi. - Dòng cuối cùng sử dụng tiếng vang để xuất ra kết quả.
Nhưng điều này chỉ hoạt động cho thư mục “/ dev”. Làm thế nào chúng ta có thể làm cho tập lệnh hoạt động với bất kỳ thư mục nào? Tất cả chỉ cần một thay đổi nhỏ.
Cách sử dụng tham số dòng lệnh trong tập lệnh
Nhiều lệnh, chẳng hạn như ls
và wc
, lấy tham số dòng lệnh. Những điều này cung cấp thông tin cho lệnh, vì vậy nó biết bạn muốn nó làm gì. Nếu bạn muốnls
để làm việc trên thư mục chính của bạn và cũng để hiển thị các tệp ẩn, bạn có thể sử dụng lệnh sau, trong đó dấu ngã ~
và -a
(tất cả) tùy chọn là các tham số dòng lệnh:
ls ~ -a
Các tập lệnh của chúng tôi có thể chấp nhận các tham số dòng lệnh. Họ được gọi là $1
cho tham số đầu tiên, $2
như thứ hai, v.v., lên đến $9
cho tham số thứ chín. (Trên thực tế, có một $0
, nhưng điều đó được dành riêng để luôn giữ kịch bản.)
Bạn có thể tham chiếu các tham số dòng lệnh trong một tập lệnh giống như bạn làm với các biến thông thường. Hãy sửa đổi tập lệnh của chúng tôi, như được hiển thị bên dưới và lưu nó với tên mớifcnt2.sh
:
#! / bin / bash folder_to_count = $ 1 file_count = $ (ls $ folder_to_count | wc -l) echo $ tệp_count tệp trong $ folder_to_count
Lần này, folder_to_count
biến được gán giá trị của tham số dòng lệnh đầu tiên, $1
.
Phần còn lại của kịch bản hoạt động chính xác như nó đã làm trước đó. Thay vì một giải pháp cụ thể, tập lệnh của bạn bây giờ là một giải pháp chung. Bạn có thể sử dụng nó trên bất kỳ thư mục nào vì nó không được mã hóa cứng để chỉ hoạt động với “/ dev”.
Đây là cách bạn làm cho tập lệnh có thể thực thi được:
chmod + x fcnt2.sh
Bây giờ, hãy thử nó với một vài thư mục. Bạn có thể thực hiện “/ dev” trước để đảm bảo rằng bạn nhận được kết quả tương tự như trước đây. Nhập nội dung sau:
./fnct2.sh / dev
./fnct2.sh / etc
./fnct2.sh / bin
Bạn nhận được kết quả tương tự (207 tệp) như trước cho thư mục “/ dev”. Điều này rất đáng khích lệ và bạn sẽ nhận được kết quả theo thư mục cụ thể cho từng tham số dòng lệnh khác.
Để rút ngắn tập lệnh, bạn có thể phân phối với biến,folder_to_count
, hoàn toàn và chỉ là tham khảo $1
trong suốt, như sau:
#! / bin / bash file_count = $ (ls $ 1 wc -l) echo $ file_count tệp trong $ 1
Làm việc với các biến đặc biệt
Chúng tôi đã đề cập $0
, luôn được đặt thành tên tệp của tập lệnh. Điều này cho phép bạn sử dụng tập lệnh để thực hiện những việc như in tên của nó một cách chính xác, ngay cả khi nó đã được đổi tên. Điều này hữu ích trong các tình huống ghi nhật ký, trong đó bạn muốn biết tên của quá trình đã thêm một mục nhập.
Sau đây là các biến đặt trước đặc biệt khác:
- $#: Có bao nhiêu tham số dòng lệnh đã được chuyển cho tập lệnh.
- $@: Tất cả các tham số dòng lệnh được truyền cho script.
- $?: Trạng thái thoát của tiến trình cuối cùng chạy.
- $$: ID quy trình (PID) của tập lệnh hiện tại.
- USER $: Tên người dùng của người dùng thực thi tập lệnh.
- $ HOSTNAME: Tên máy tính của máy tính chạy script.
- $ SECONDS: Số giây mà tập lệnh đã chạy.
- $ NGẪU NHIÊN: Trả về một số ngẫu nhiên.
- $ LINENO: Trả về số dòng hiện tại của script.
Bạn muốn xem tất cả chúng trong một tập lệnh, phải không? Bạn có thể! Lưu phần sau dưới dạng tệp văn bản có tên,đặc biệt.sh
:
#! / bin / bash echo "Có $ # tham số dòng lệnh" echo "Chúng là: $ @" echo "Tham số 1 là: $ 1" echo "Tập lệnh được gọi là: $ 0" # bất kỳ quy trình cũ nào để chúng tôi có thể báo cáo ở trạng thái thoát pwd echo "pwd đã trả về $?" echo "Tập lệnh này có ID quy trình $$" echo "Tập lệnh được bắt đầu bởi $ USER" echo "Nó đang chạy trên $ HOSTNAME" sleep 3 echo "Nó đã chạy trong $ SECONDS giây" echo "Số ngẫu nhiên: $ RANDOM" echo "Đây là dòng $ LINENO của tập lệnh"
Nhập thông tin sau để làm cho nó có thể thực thi được:
chmod + x special.sh
Bây giờ, bạn có thể chạy nó với một loạt các tham số dòng lệnh khác nhau, như được hiển thị bên dưới.
Các biến môi trường
Bash sử dụng các biến môi trường để xác định và ghi lại các thuộc tính của môi trường mà nó tạo ra khi khởi chạy. Những thông tin lưu giữ này Bash có thể dễ dàng truy cập, chẳng hạn như tên người dùng, ngôn ngữ của bạn, số lượng lệnh mà tệp lịch sử của bạn có thể giữ, trình chỉnh sửa mặc định của bạn và nhiều hơn nữa.
Để xem các biến môi trường hoạt động trong phiên Bash của bạn, hãy sử dụng lệnh sau:
env | ít hơn
Nếu bạn cuộn qua danh sách, bạn có thể tìm thấy một số hữu ích để tham khảo trong các tập lệnh của bạn.
Cách xuất biến
Khi một tập lệnh chạy, nó nằm trong quy trình của chính nó và không thể nhìn thấy các biến mà tập lệnh sử dụng bên ngoài quy trình đó. Nếu bạn muốn chia sẻ một biến với một tập lệnh khác mà tập lệnh của bạn khởi chạy, bạn phải xuất biến đó. Chúng tôi sẽ chỉ cho bạn cách thực hiện điều này bằng hai tập lệnh.
Đầu tiên, lưu phần sau với tên tệpscript_one.sh
:
#! / bin / bash first_var = alpha second_var = bravo # kiểm tra giá trị của chúng echo "$ 0: first_var = $ first_var, second_var = $ second_var" export first_var export second_var ./script_two.sh # kiểm tra lại giá trị của chúng echo "$ 0: first_var = $ first_var, second_var = $ second_var "
Điều này tạo ra hai biến, first_var
và second_var
và nó chỉ định một số giá trị. Nó in chúng ra cửa sổ đầu cuối, xuất các biến và gọi script_two.sh
. Khi nào script_two.sh
kết thúc, và luồng quy trình quay trở lại tập lệnh này, nó lại in các biến vào cửa sổ đầu cuối. Sau đó, bạn có thể xem liệu họ có thay đổi hay không.
Tập lệnh thứ hai chúng tôi sẽ sử dụng là script_two.sh
. Đây là kịch bảnscript_one.sh
cuộc gọi. Nhập nội dung sau:
#! / bin / bash # kiểm tra giá trị của chúng echo "$ 0: first_var = $ first_var, second_var = $ second_var" # đặt giá trị mới first_var = charlie second_var = delta # kiểm tra lại giá trị của chúng echo "$ 0: first_var = $ first_var, second_var = $ second_var "
Tập lệnh thứ hai này in giá trị của hai biến, gán giá trị mới cho chúng, rồi in lại.
Để chạy các tập lệnh này, bạn phải nhập như sau để làm cho chúng có thể thực thi:
chmod + x script_one.sh chmod + x script_two.sh
Và bây giờ, hãy nhập nội dung sau để khởi chạy script_one.sh
:
./script_one.sh
Đây là những gì đầu ra cho chúng ta biết:
- script_one.sh in ra các giá trị của các biến, là alpha và bravo.
- script_two.sh in các giá trị của các biến (alpha và bravo) khi nó nhận được chúng.
- script_two.sh thay đổi chúng thành charlie và delta.
- script_one.sh in ra các giá trị của các biến vẫn là alpha và bravo.
Điều gì xảy ra trong kịch bản thứ hai, nằm trong kịch bản thứ hai. Nó giống như bản sao của các biến được gửi đến tập lệnh thứ hai, nhưng chúng sẽ bị loại bỏ khi tập lệnh đó thoát. Các biến ban đầu trong tập lệnh đầu tiên không bị thay đổi bởi bất kỳ điều gì xảy ra với các bản sao của chúng trong tập lệnh thứ hai.
Cách trích dẫn các biến
Bạn có thể nhận thấy rằng khi tập lệnh tham chiếu các biến, chúng nằm trong dấu ngoặc kép "
. Điều này cho phép các biến được tham chiếu một cách chính xác, vì vậy giá trị của chúng được sử dụng khi dòng được thực thi trong tập lệnh.
Nếu giá trị bạn gán cho một biến bao gồm khoảng trắng, chúng phải nằm trong dấu ngoặc kép khi bạn gán chúng cho biến. Điều này là do, theo mặc định, Bash sử dụng một khoảng trắng làm dấu phân cách.
Đây là một ví dụ:
site_name = Hướng dẫn cách tìm hiểu
Bash coi khoảng trắng trước “Geek” là dấu hiệu cho thấy một lệnh mới đang bắt đầu. Nó báo cáo rằng không có lệnh như vậy và bỏ dòng. tiếng vọng lại
cho chúng ta thấy rằng Tên trang web
biến không chứa gì — thậm chí không phải là văn bản “Hướng dẫn”.
Hãy thử lại điều đó với dấu ngoặc kép xung quanh giá trị, như được hiển thị bên dưới:
site_name = "Hướng dẫn cách tìm hiểu"
Lần này, nó được công nhận là một giá trị duy nhất và được chỉ định chính xác cho Tên trang web
Biến đổi.
echo Là bạn của bạn
Có thể mất một chút thời gian để làm quen với lệnh thay thế, trích dẫn các biến và nhớ khi nào nên bao gồm ký hiệu đô la.
Trước khi bạn nhấn Enter và thực hiện một dòng lệnh Bash, hãy thử với tiếng vọng lại
trước mặt nó. Bằng cách này, bạn có thể đảm bảo những gì sắp xảy ra là những gì bạn muốn. Bạn cũng có thể bắt gặp bất kỳ lỗi nào bạn có thể mắc phải trong cú pháp.