3.3 Bài 1
Chứng chỉ: |
Linux Essentials |
---|---|
Phiên bản: |
1.6 |
Chủ đề: |
3 Sức mạnh của Dòng lệnh |
Mục tiêu: |
3.3 Biến các Lệnh thành một Tệp lệnh |
Bài: |
1 trên 2 |
Giới thiệu
Cho đến nay, chúng ta đã học cách thực thi các lệnh từ vỏ, nhưng chúng ta cũng có thể nhập các lệnh vào một tệp, sau đó đặt tệp đó thành tệp có thể thực thi được. Khi tệp được thực thi, các lệnh đó sẽ được chạy lần lượt. Các tệp thực thi này được gọi là tệp lệnh và chúng là một công cụ cực kỳ quan trọng đối với bất kỳ quản trị viên hệ thống Linux nào. Về cơ bản, chúng ta có thể coi Bash vừa là ngôn ngữ lập trình, vừa là vỏ.
Đầu ra In
Hãy bắt đầu bằng cách minh họa một lệnh mà bạn đã thấy trong các bài học trước: echo
sẽ in một đối số ra đầu ra tiêu chuẩn.
$ echo "Hello World!" Hello World!
Bây giờ, chúng ta sẽ sử dụng chuyển hướng tệp để gửi lệnh này đến một tệp mới có tên new_script
.
$ echo 'echo "Hello World!"' > new_script $ cat new_script echo "Hello World!"
Tệp new_script
hiện đã chứa lệnh giống như trên.
Tạo Têp lệnh Thực thi
Hãy cùng minh hoạ một số bước cần thiết để làm cho tệp này thực thi theo cách ta mong đợi. Nhiều khả năng người dùng sẽ nghĩ ngay đến việc chỉ cần gõ tên của tệp lệnh giống như cách họ có thể gõ tên của bất kỳ lệnh nào khác:
$ new_script /bin/bash: new_script: command not found
Chúng ta có thể giả định rằng new_script
có tồn tại ở vị trí hiện tại của chúng ta, nhưng phải lưu ý rằng thông báo lỗi sẽ không cho chúng ta biết rằng tệp không tồn tại mà nó sẽ cho chúng ta biết rằng lệnh không tồn tại. Sẽ rất hữu ích nếu chúng ta thảo luận về cách Linux xử lý các lệnh và các tệp thực thi.
Lệnh và PATH
Ví dụ: khi chúng ta nhập lệnh ls
vào vỏ, ta đang thực thi một tệp có tên là ls
tồn tại trong hệ thống tệp. Bạn có thể chứng minh điều này bằng cách sử dụng ` which`:
$ which ls /bin/ls
Nếu mỗi khi muốn xem nội dung của một thư mục ta lại phải tự tay gõ từng chữ một đường dẫn tuyệt đối của ls
thì rất mất thời gian, vì vậy Bash có một biến môi trường để chứa tất cả các thư mục nơi chúng ta có thể tìm thấy các lệnh mà ta muốn chạy. Bạn có thể xem nội dung của biến này bằng cách sử dụng echo
.
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Mỗi vị trí này là nơi vỏ dự kiến sẽ tìm thấy một lệnh và sẽ được phân tách bằng dấu hai chấm (:
). Bạn sẽ nhận thấy rằng /bin
cũng có mặt, nhưng có thể giả định rằng vị trí hiện tại của chúng ta thì lại không có. Vỏ sẽ tìm kiếm new_script
trong mỗi thư mục này, nhưng nó sẽ không tìm được và do đó sẽ đưa ra thông báo lỗi như chúng ta đã thấy ở trên.
Có ba giải pháp cho vấn đề này: chúng ta có thể di chuyển new_script
vào một trong các thư mục PATH
, có thể thêm thư mục hiện tại của mình vào PATH
hoặc thay đổi cách gọi têp lệnh. Giải pháp thứ hai là dễ nhất, nó chỉ yêu cầu ta xác định vị trí hiện tại khi gọi têp lệnh bằng cách sử dụng dấu gạch chéo (./
).
$ ./new_script /bin/bash: ./new_script: Permission denied
Thông báo lỗi đã thay đổi, tức là chúng ta đã đạt được một số tiến triển.
Thực thi các Quyền
Việc đầu tiên mà người dùng nên thực hiện trong trường hợp này là sử dụng ls -l
để xem tệp:
$ ls -l new_script -rw-rw-r-- 1 user user 20 Apr 30 12:12 new_script
Chúng ta có thể thấy rằng các quyền đối với tệp này được đặt thành 664
theo mặc định. Chúng ta chưa cài đặt để tệp này có quyền thực thi.
$ chmod +x new_script $ ls -l new_script -rwxrwxr-x 1 user user 20 Apr 30 12:12 new_script
Lệnh này đã cấp quyền thực thi cho tất cả mọi người dùng. Hãy lưu ý rằng đây có thể là một rủi ro bảo mật, nhưng hiện tại thì đây là mức quyền có thể chấp nhận được.
$ ./new_script Hello World!
Bây giờ chúng ta đã có thể thực thi tệp lệnh của mình.
Định nghĩa Trình thông dịch
Như đã biết, chúng ta có thể chỉ cần nhập văn bản vào một tệp, đặt nó làm tệp thực thi và chạy nó. new_script
về mặt chức năng vẫn là một tệp văn bản bình thường, nhưng chúng ta đã có thể để cho Bash diễn giải nó. Nhưng nếu tệp lệnh được viết bằng Perl hoặc Python thì sao?
Việc xác định loại trình thông dịch mà ta muốn sử dụng trong dòng đầu tiên của tệp lệnh là một thao tác hữu ích. Dòng này được gọi là bang line, hoặc phổ biến hơn là shebang. Nó cho hệ thống biết chúng ta muốn tệp này được thực thi như thế nào. Vì đang tìm hiểu về Bash nên chúng ta sẽ sử dụng đường dẫn tuyệt đối đến tệp thực thi Bash, một lần nữa sử dụng ` which`:
$ which bash /bin/bash
Shebang bắt đầu bằng dấu thăng và dấu chấm than, theo sau là đường dẫn tuyệt đối ở trên. Hãy mở new_script
trong một trình soạn thảo văn bản và chèn Shebang. Chúng ta cũng hãy tận dụng cơ hội để chèn một chú thích vào tệp lệnh của mình. Chú thích sẽ được trình thông dịch bỏ qua. Chúng được chèn vào vì lợi ích của những người dùng khác muốn hiểu rõ hơn về tệp lệnh của bạn.
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. echo "Hello World!"
Chúng ta cũng sẽ thực hiện một thay đổi bổ sung đối với tên tệp: chúng ta sẽ lưu tệp này dưới dạng new_script.sh
. Hậu tố tệp ".sh" sẽ không thay đổi việc thực thi tệp theo bất kỳ cách nào. Theo quy ước, các tệp lệnh bash sẽ được gắn nhãn .sh
hoặc .bash
để ta có thể nhận dạng chúng dễ dàng hơn, giống như cách mà các tệp lệnh Python thường được xác định bằng hậu tố .py
.
Trình soạn thảo Văn bản phổ biến
Người dùng Linux thường phải làm việc trong môi trường không có trình soạn thảo văn bản đồ họa. Do vậy, chúng ta nên trở nên quen thuộc với thao tác chỉnh sửa tệp văn bản từ dòng lệnh ở một mức độ nhất định. Hai trong số các trình soạn thảo văn bản phổ biến nhất là vi
và nano
.
vi
vi
là một trình soạn thảo văn bản đáng tin cậy và được cài đặt theo mặc định trên hầu hết mọi hệ thống Linux hiện có. vi
đã cho ra một bản sao có tên vi IMproved hoặc vim
để bổ sung một số chức năng trong khi vẫn duy trì giao diện vi
nguyên bản. Mặc dù việc làm việc với vi
gây khó khăn cho người dùng mới nhưng trình chỉnh sửa này rất phổ biến và được yêu thích bởi những người dùng đã cất công tìm hiểu về nhiều các tính năng của nó.
Sự khác biệt quan trọng nhất giữa vi
và các ứng dụng như Notepad là vi
có ba chế độ khác nhau. Khi khởi động, các phím H, J, K và L được sử dụng để điều hướng chứ không phải để nhập. Trong chế độ điều hướng, bạn có thể nhấn phím I để vào chế độ nhập. Bây giờ thì bạn có thể gõ bình thường. Để thoát khỏi chế độ nhập, hãy nhấn phim Esc để quay lại chế độ điều hướng. Từ chế độ điều hướng, bạn có thể nhấn phím : để vào chế độ lệnh. Từ chế độ này, bạn có thể lưu, xóa, thoát hoặc thay đổi tùy chọn.
Mặc dù vi
cần có thời gian để có thể lĩnh hội, các chế độ khác nhau có thể kịp thời cho phép một người dùng tnhanh nhạy làm việc hiệu quả hơn so với khi sử dụng các trình chỉnh sửa khác.
nano
nano
là một công cụ mới hơn, được thiết kế đơn giản và dễ sử dụng hơn vi
. nano
không có các chế độ khác nhau. Thay vào đó, khi khởi động, người dùng có thể bắt đầu nhập và sử dụng phím Ctrl để truy cập các công cụ được in ở cuối màn hình.
[ Welcome to nano. For basic help, type Ctrl+G. ] ^G Get Help ^O Write Out ^W Where Is ^K Cut Text ^J Justify ^C Cur Pos M-U Undo ^X Exit ^R Read File ^\ Replace ^U Uncut Text ^T To Spell ^_ Go To Line M-E Redo
Trình soạn thảo văn bản là vấn đề sở thích cá nhân và trình soạn thảo mà bạn chọn sử dụng sẽ không ảnh hưởng gì đến bài học này. Tuy vậy, việc trở nên quen thuộc và thoải mái với một hoặc nhiều trình soạn thảo văn bản sẽ mang lại cho chúng ta một kết quả xứng đáng trong tương lai.
Biến
Biến là một phần quan trọng của bất kỳ một ngôn ngữ lập trình nào, và Bash cũng không phải là một ngoại lệ. Khi bạn bắt đầu một phiên mới từ cửa sổ dòng lệnh, vỏ đã đặt sẵn một số biến cho bạn. Biến PATH
là một ví dụ về điều này. Ta gọi đây là các biến môi trường vì chúng thường xác định các đặc điểm của môi trường vỏ của chúng ta. Các biến môi trường có thể được thêm vào và sửa đổi, nhưng bây giờ ta nên tập trung vào việc thiết lập các biến bên trong tệp lệnh.
Ta sẽ sửa đổi tệp lệnh của mình để nó trông như thế này:
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username=Carol echo "Hello $username!"
Trong trường hợp này, chúng ta đã tạo ra một biến được gọi là username
và ta đã gán cho nó giá trị của Carol
. Hãy lưu ý rằng không có khoảng cách giữa tên biến, dấu bằng hoặc giá trị được gán.
Trong dòng tiếp theo, chúng ta đã sử dụng lệnh echo
với biến, nhưng có một ký hiệu đô la ($
) trước tên biến. Điều này rất quan trọng vì nó cho vỏ biết rằng chúng ta muốn coi username
là một biến chứ không chỉ là một từ bình thường. Bằng cách nhập $username
vào lệnh, vỏ sẽ hiểu là ta muốn thực hiện phép thay thế, tức thay thế tên của một biến bằng giá trị được gán cho biến đó.
Khi thực thi tệp lệnh mới, chúng ta sẽ nhận được kết quả này:
$ ./new_script.sh Hello Carol!
-
Tên biến chỉ được chứa ký tự chữ và số hoặc dấu gạch dưới và phải phân biệt chữ hoa chữ thường.
Username
vàưsername
sẽ được coi là hai biến khác nhau. -
Biến thay thế cũng có thể có định dạng
${username}
bằng cách thêm{ }
. Điều này cũng được chấp nhận. -
Các biến trong Bash có kiểu ngầm định và được coi là các chuỗi. Điều này có nghĩa là việc thực hiện các hàm toán học trong Bash sẽ phức tạp hơn so với trong các ngôn ngữ lập trình khác như C/C++:
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username=Carol x=2 y=4 z=$x+$y echo "Hello $username!" echo "$x + $y" echo "$z"
$ ./new_script.sh Hello Carol! 2 + 4 2+4
Sử dụng Trích dẫn với các Biến
Hãy thực hiện thay đổi sau đối với giá trị của biến username
:
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username=Carol Smith echo "Hello $username!"
Việc chạy tệp lệnh này sẽ cho ra lỗi:
$ ./new_script.sh ./new_script.sh: line 5: Smith: command not found Hello !
Hãy nhớ rằng Bash là một trình thông dịch và do đó, nó thông dịch từng dòng của tệp lệnh. Trong trường hợp này, nó diễn giải chính xác username=Carol
là đang đặt một biến username
với giá trị Carol
. Nhưng sau đó, nó sẽ diễn giải khoảng trắng là biểu thị kết thúc nhiệm vụ đó, và Smith
là tên của một lệnh. Để có khoảng trắng và tên Smith
được đưa vào làm giá trị mới của biến, chúng ta sẽ phải đặt dấu trích dẫn kép ("
) bên ngoài Carol Smith.
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username="Carol Smith" echo "Hello $username!"
$ ./new_script.sh Hello Carol Smith!
Một điều quan trọng cần lưu ý trong Bash là dấu trích dẫn kép và trích dẫn đơn ('
) hoạt động theo hai cách hoàn toàn khác nhau. Dấu trích dẫn kép được coi là “yếu” vì chúng cho phép trình thông dịch thực hiện thay thế bên trong dấu. Dấu trích dẫn đơn được coi là “mạnh” vì chúng ngăn không cho bất kỳ sự thay thế nào xảy ra. Hãy xem ví dụ sau:
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username="Carol Smith" echo "Hello $username!" echo 'Hello $username!'
$ ./new_script.sh Hello Carol Smith! Hello $username!
Trong lệnh echo
thứ hai, trình thông dịch đã bị ngăn không cho thay thế $username
bằng Carol Smith
, vì vậy nên đầu ra sẽ được hiểu theo nghĩa đen.
Đối số
Bạn đã quen với việc sử dụng các đối số trong các tiện ích cốt lõi của Linux. Ví dụ: rm testfile
chứa cả tệp thực thi rm
và một đối số testfile
. Các đối số có thể được chuyển đến tệp lệnh khi thực thi và sẽ sửa đổi cách tệp lệnh hoạt động. Chúng có thể được thực hiện một cách dễ dàng.
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username=$1 echo "Hello $username!"
Thay vì gán một giá trị cho username
ngay bên trong tệp lệnh, chúng ta đang gán cho nó giá trị của một biến mới là $1
, tức giá trị của đối số đầu tiên.
$ ./new_script.sh Carol Hello Carol!
Chín đối số đầu tiên sẽ được xử lý theo cách này. Có nhiều cách để xử lý hơn chín đối số, nhưng điều đó nằm ngoài phạm vi của bài học này. Chúng ta sẽ minh hoạ một ví dụ chỉ sử dụng hai đối số:
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username1=$1 username2=$2 echo "Hello $username1 and $username2!"
$ ./new_script.sh Carol Dave Hello Carol and Dave!
Có một việc quan trọng cần phải cân nhắc khi sử dụng đối số: Trong ví dụ trên, có hai đối số là Carol
và Dave
tương ứng được gán cho $1
và $2
. Ví dụ, nếu đối số thứ hai bị thiếu, vỏ sẽ không đưa ra lỗi. Giá trị của $2
sẽ đơn giản là null hoặc không có gì cả.
$ ./new_script.sh Carol Hello Carol and !
Trong trường hợp của chúng ta, việc đưa một số logic vào tệp lệnh để các điều kiện khác nhau ảnh hưởng đến đầu ra mà ta muốn in là một ý hay. Chúng ta sẽ bắt đầu bằng cách giới thiệu một biến hữu ích khác và sau đó chuyển sang tạo các câu lệnh if.
Trả về Số của Đối số
Trong khi các biến như $1
và $2
chứa giá trị của các đối số vị trí thì một biến khác là $#
sẽ chứa số lượng đối số.
#!/bin/bash # This is our first comment. It is also good practice to document all scripts. username=$1 echo "Hello $username!" echo "Number of arguments: $#."
$ ./new_script.sh Carol Dave Hello Carol! Number of arguments: 2.
Logic có điều kiện
Việc sử dụng logic có điều kiện trong lập trình là một chủ đề rộng và sẽ không được đề cập sâu trong bài học này. Chúng ta sẽ tập trung vào cú pháp của các điều kiện trong Bash - yếu tố khác biệt so với hầu hết các ngôn ngữ lập trình khác.
Hãy bắt đầu bằng cách xem xét những gì chúng ta muốn đạt được. Chúng ta có một tệp lệnh đơn giản có thể in lời chào cho một người dùng. Nếu có bất kỳ ai khác ngoài một người dùng, chúng ta sẽ in một thông báo lỗi.
-
Điều kiện mà chúng ta đang thử là số lượng người dùng được chứa trong biến
$#
. Chúng ta muốn biết liệu giá trị của$#
có phải là1
hay không. -
Nếu điều kiện là đúng thì hành động chúng ta sẽ thực hiện là chào người dùng.
-
Nếu điều kiện là sai, chúng ta sẽ in thông báo lỗi. Bây giờ logic đã rõ ràng, chúng ta sẽ tập trung vào cú pháp cần thiết để triển khai logic này.
#!/bin/bash # A simple script to greet a single user. if [ $# -eq 1 ] then username=$1 echo "Hello $username!" else echo "Please enter only one argument." fi echo "Number of arguments: $#."
Logic điều kiện được chứa ở giữa if
và fi
. Điều kiện để kiểm tra nằm giữa các dấu ngoặc vuông [ ]
và hành động cần thực hiện nếu điều kiện là đúng được biểu thị sau then
. Lưu ý khoảng cách giữa các dấu ngoặc vuông và logic chứa trong đó. Việc bỏ qua khoảng cách này sẽ gây ra lỗi.
Tệp lệnh này sẽ xuất ra lời chào của chúng ta hoặc thông báo lỗi. Nhưng nó sẽ luôn in dòng Number of arguments
(Số của Đối số).
$ ./new_script.sh Please enter only one argument. Number of arguments: 0. $ ./new_script.sh Carol Hello Carol! Number of arguments: 1.
Lưu ý câu lệnh if
. Chúng ta đã sử dụng -eq
để thực hiện so sánh số. Trong trường hợp này, ta đang kiểm tra xem giá trị của $#
có bằng với 1 hay không. Các so sánh khác chúng ta có thể thực hiện là:
-ne
-
Không bằng
-gt
-
Lớn hơn
-ge
-
Lớn hơn hoặc bằng
-lt
-
Ít hơn
-le
-
Ít hơn hoặc bằng
Bài tập Hướng dẫn
-
Người dùng nhập nội dung sau vào vỏ của họ:
$ PATH=~/scripts $ ls Command 'ls' is available in '/bin/ls' The command could not be located because '/bin' is not included in the PATH environment variable. ls: command not found
-
Người dùng đã làm gì?
-
Lệnh nào sẽ kết hợp giá trị hiện tại của
PATH
với thư mục mới~/scripts
?
-
-
Hãy xem xét các tệp lệnh sau đây. Hãy lưu ý rằng nó đang sử dụng
elif
để kiểm tra điều kiện thứ hai:> /!bin/bash > fruit1 = Apples > fruit2 = Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" > elif [$1 -gt $2 ] then > echo '$fruit1 win!' else > echo "Fruit2 win!" > done
-
Các dòng được đánh dấu
>
chứa lỗi. Hãy tiến hành sửa lỗi.
-
-
Đầu ra sẽ là gì trong các tình huống sau đây?
$ ./guided1.sh 3 0
$ ./guided1.sh 2 4
$ ./guided1.sh 0 1
Bài tập Mở rộng
-
Hãy viết một tệp lệnh đơn giản để kiểm tra xem có chính xác là hai đối số đã được thông qua hay không. Nếu đúng, hãy in các đối số theo thứ tự ngược lại. Hãy xem ví dụ này (lưu ý: mã của bạn có thể trông khác với mã này nhưng vẫn nên dẫn đến cùng một đầu ra):
if [ $1 == $number ] then echo "True!" fi
-
Đoạn mã này là chính xác nhưng nó không phải là một phép so sánh số. Hãy thử tìm kiếm trên internet để khám phá xem mã này khác với việc sử dụng
-eq
như thế nào. -
Có một biến môi trường sẽ in thư mục hiện tại. Hãy sử dụng
env
để khám phá tên của biến này. -
Sử dụng những gì bạn đã học được trong câu hỏi 2 và 3, hãy viết một tệp lệnh ngắn chấp nhận một đối số. Nếu một đối số được thông qua, hãy kiểm tra xem đối số đó có khớp với tên của thư mục hiện tại không. Nếu đúng, hãy in
yes
. Nếu sai, hãy inno
.
Tóm tắt
Trong bài học này, bạn đã học được:
-
Cách tạo và thực thi các tệp lệnh đơn giản
-
Cách sử dụng shebang để chỉ định trình thông dịch
-
Cách đặt và sử dụng các biến bên trong tệp lệnh
-
Cách xử lý đối số trong tệp lệnh
-
Cách xây dựng câu lệnh
if
-
Cách so sánh các số bằng toán tử số Các lệnh được dùng trong bài tập:
echo
-
In một chuỗi ra đầu ra tiêu chuẩn.
env
-
In tất cả các biến môi trường thành đầu ra tiêu chuẩn.
which
-
In đường dẫn tuyệt đối của một lệnh.
chmod
-
Thay đổi quyền của một tệp.
Các biến đặc biệt dùng trong bài tập:
$1, $2, … $9
-
Chứa các đối số vị trí được chuyển đến tệp lệnh.
$#
-
Chứa số lượng đối số được truyền cho tệp lệnh.
$PATH
-
Chứa các thư mục có các tệp thực thi được sử dụng bởi hệ thống.
Các toán tử dùng trong bài tập:
-ne
::
Không bằng
-gt
::
Lớn hơn
-ge
::
Lớn hơn hoặc bằng
-lt
::
Ít hơn
-le
::
Ít hơn hoặc bằng
Đáp án Bài tập Hướng dẫn
-
Người dùng nhập nội dung sau vào vỏ của họ:
$ PATH=~/scripts $ ls Command 'ls' is available in '/bin/ls' The command could not be located because '/bin' is not included in the PATH environment variable. ls: command not found
-
Người dùng đã làm gì?
Người dùng đã ghi đè nội dung của PATH bằng thư mục
~/scripts
. Sẽ không thể tìm thấy lệnhls
nữa vì lệnh này không có trong PATH. Hãy lưu ý rằng thay đổi này chỉ ảnh hưởng đến phiên làm việc hiện tại, nếu bạn đăng xuất và đăng nhập lại sẽ hoàn nguyên thay đổi. -
Lệnh nào sẽ kết hợp giá trị hiện tại của
PATH
với thư mục mới~/scripts
?PATH=$PATH:~/scripts
-
-
Hãy xem xét các tệp lệnh sau đây. Hãy lưu ý rằng nó đang sử dụng
elif
để kiểm tra điều kiện thứ hai:> /!bin/bash > fruit1 = Apples > fruit2 = Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" > elif [$1 -gt $2 ] then > echo '$fruit1 win!' else > echo "Fruit2 win!" > done
-
Các dòng được đánh dấu
>
chứa lỗi. Hãy tiến hành sửa lỗi.#!/bin/bash fruit1=Apples fruit2=Oranges if [ $1 -lt $# ] then echo "This is like comparing $fruit1 and $fruit2!" elif [ $1 -gt $2 ] then echo "$fruit1 win!" else echo "$fruit2 win!" fi
-
-
Đầu ra sẽ là gì trong các tình huống sau đây?
$ ./guided1.sh 3 0
Apples win!
$ ./guided1.sh 2 4
Oranges win!
$ ./guided1.sh 0 1
This is like comparing Apples and Oranges!
Đáp án Bài tập Mở rộng
-
Hãy viết một tệp lệnh đơn giản để kiểm tra xem có chính xác là hai đối số đã được thông qua hay không. Nếu đúng, hãy in các đối số theo thứ tự ngược lại. Hãy xem ví dụ này (lưu ý: mã của bạn có thể trông khác với mã này nhưng vẫn nên dẫn đến cùng một đầu ra):
if [ $1 == $number ] then echo "True!" fi
#!/bin/bash if [ $# -ne 2 ] then echo "Error" else echo "$2 $1" fi
-
Đoạn mã này là chính xác nhưng nó không phải là một phép so sánh số. Hãy thử tìm kiếm trên internet để khám phá xem mã này khác với việc sử dụng
-eq
như thế nào.Sử dụng
==
sẽ so sánh các chuỗi. Nghĩa là nếu các ký tự của cả hai biến khớp chính xác thì điều kiện là đúng.abc == abc
true
abc == ABC
false
1 == 1
true
1+1 == 2
false
So sánh chuỗi dẫn đến hành vi không mong muốn nếu bạn đang kiểm tra số.
-
Có một biến môi trường sẽ in thư mục hiện tại. Hãy sử dụng
env
để khám phá tên của biến này.PWD
-
Sử dụng những gì bạn đã học được trong câu hỏi 2 và 3, hãy viết một tệp lệnh ngắn chấp nhận một đối số. Nếu một đối số được thông qua, hãy kiểm tra xem đối số đó có khớp với tên của thư mục hiện tại không. Nếu đúng, hãy in
yes
. Nếu sai, hãy inno
.#!/bin/bash if [ "$1" == "$PWD" ] then echo "yes" else echo "no" fi