Bash là một ngôn ngữ lập trình mạnh mẽ, được thiết kế hoàn hảo cho việc sử dụng trên dòng lệnh và trong các script shell. Chuỗi bài viết ba phần này (dựa trên khóa tự học Linux ba tập của tác giả) khám phá việc sử dụng Bash như một ngôn ngữ lập trình trên giao diện dòng lệnh (CLI).
Bài viết đầu tiên đã tìm hiểu một số lập trình dòng lệnh đơn giản với Bash, bao gồm việc sử dụng biến và toán tử điều khiển. Bài viết thứ hai này đi sâu vào các loại toán tử logic cho file, chuỗi, số và các toán tử hỗn hợp khác cung cấp logic điều khiển luồng thực thi, cũng như các loại mở rộng shell khác nhau trong Bash. Bài viết thứ ba và cuối cùng trong chuỗi sẽ khám phá các vòng lặp for, while và until cho phép thực hiện các thao tác lặp lại.
Toán tử logic là cơ sở để ra quyết định trong chương trình và thực thi các tập hợp hướng dẫn khác nhau dựa trên những quyết định đó. Điều này đôi khi được gọi là điều khiển luồng.
Toán tử logic
Bash có một tập hợp lớn các toán tử logic có thể sử dụng trong biểu thức điều kiện. Cấu trúc điều khiển if cơ bản nhất kiểm tra một điều kiện và sau đó thực thi một danh sách câu lệnh chương trình nếu điều kiện đó đúng. Có ba loại toán tử: toán tử file, số và phi số. Mỗi toán tử trả về true (0) nếu điều kiện được đáp ứng và false (1) nếu không.
Cú pháp chức năng của các toán tử so sánh này là một hoặc hai đối số với một toán tử được đặt trong ngoặc vuông, theo sau là danh sách câu lệnh chương trình được thực thi nếu điều kiện đúng, và một danh sách tùy chọn nếu điều kiện sai:
if [ arg1 operator arg2 ] ; then list
hoặc
if [ arg1 operator arg2 ] ; then list ; else list ; fi
Các khoảng trắng trong so sánh là bắt buộc như hiển thị. Ngoặc vuông đơn [ và ] là các ký hiệu Bash truyền thống tương đương với lệnh test:
if test arg1 operator arg2 ; then list
Cũng có một cú pháp mới hơn cung cấp một vài ưu điểm và một số quản trị hệ thống ưu tiên. Định dạng này kém tương thích hơn với các phiên bản Bash và shell khác nhau, chẳng hạn như ksh (Korn shell). Trông như sau:
if [[ arg1 operator arg2 ]] ; then list
Toán tử file
Toán tử file là một tập hợp mạnh mẽ các toán tử logic trong Bash. Hình 1 liệt kê hơn 20 toán tử khác nhau mà Bash có thể thực hiện trên file. Tác giả sử dụng chúng khá thường xuyên trong các script.
| Toán tử | Mô tả |
|---|---|
| -a filename | True nếu file tồn tại; có thể rỗng hoặc có nội dung nhưng miễn là tồn tại thì trả về true |
| -b filename | True nếu file tồn tại và là file đặc biệt block như ổ cứng /dev/sda hoặc /dev/sda1 |
| -c filename | True nếu file tồn tại và là file đặc biệt character như thiết bị TTY /dev/TTY1 |
| -d filename | True nếu file tồn tại và là thư mục |
| -e filename | True nếu file tồn tại; giống với -a ở trên |
| -f filename | True nếu file tồn tại và là file thường, trái ngược với thư mục, file đặc biệt thiết bị, hoặc link |
| -g filename | True nếu file tồn tại và có set-group-id, SETGID |
| -h filename | True nếu file tồn tại và là symbolic link |
| -k filename | True nếu file tồn tại và bit "sticky" được thiết lập |
| -p filename | True nếu file tồn tại và là named pipe (FIFO) |
| -r filename | True nếu file tồn tại và có thể đọc, tức là bit đọc được thiết lập |
| -s filename | True nếu file tồn tại và kích thước lớn hơn không; file tồn tại nhưng kích thước bằng không sẽ trả về false |
| -t fd | True nếu file descriptor fd đang mở và tham chiếu đến một terminal |
| -u filename | True nếu file tồn tại và bit set-user-id được thiết lập |
| -w filename | True nếu file tồn tại và có thể ghi |
| -x filename | True nếu file tồn tại và có thể thực thi |
| -G filename | True nếu file tồn tại và thuộc nhóm hiệu lực ID |
| -L filename | True nếu file tồn tại và là symbolic link |
| -N filename | True nếu file tồn tại và đã được sửa đổi kể từ lần đọc cuối |
| -O filename | True nếu file tồn tại và thuộc người dùng hiệu lực ID |
| -S filename | True nếu file tồn tại và là socket |
| file1 -ef file2 | True nếu file1 và file2 tham chiếu đến cùng thiết bị và số iNode |
| file1 -nt file2 | True nếu file1 mới hơn (theo ngày sửa đổi) file2, hoặc file1 tồn tại và file2 không |
| file1 -ot file2 | True nếu file1 cũ hơn file2, hoặc file2 tồn tại và file1 không |
Hình 1: Các toán tử file Bash
Ví dụ, bắt đầu bằng việc kiểm tra sự tồn tại của một file:
[student@studentvm1 testdir]$ File="TestFile1" ; if [ -e $File ] ; then echo "The file $File exists." ; else echo "The file $File does not exist." ; fi
The file TestFile1 does not exist.
[student@studentvm1 testdir]$
Tiếp theo, tạo một file để kiểm tra tên TestFile1. Hiện tại không cần chứa dữ liệu:
[student@studentvm1 testdir]$ touch TestFile1
Dễ dàng thay đổi giá trị biến $File thay vì chuỗi văn bản cho tên file ở nhiều vị trí trong chương trình CLI ngắn này:
[student@studentvm1 testdir]$ File="TestFile1" ; if [ -e $File ] ; then echo "The file $File exists." ; else echo "The file $File does not exist." ; fi
The file TestFile1 exists.
[student@studentvm1 testdir]$
Bây giờ, chạy kiểm tra để xác định xem file có tồn tại và có độ dài khác không (chứa dữ liệu). Bạn muốn kiểm tra ba điều kiện: 1. file không tồn tại; 2. file tồn tại nhưng rỗng; 3. file tồn tại và chứa dữ liệu. Do đó, bạn cần một tập hợp kiểm tra phức tạp hơn—sử dụng mệnh đề elif trong cấu trúc if-elif-else để kiểm tra tất cả điều kiện:
[student@studentvm1 testdir]$ File="TestFile1" ; if [ -s $File ] ; then echo "$File exists and contains data." ; fi
[student@studentvm1 testdir]$
Trong trường hợp này, file tồn tại nhưng không chứa dữ liệu. Thêm một chút dữ liệu và thử lại:
[student@studentvm1 testdir]$ File="TestFile1" ; echo "This is file $File" > $File ; if [ -s $File ] ; then echo "$File exists and contains data." ; fi
TestFile1 exists and contains data.
[student@studentvm1 testdir]$
Điều đó hoạt động, nhưng chỉ thực sự chính xác cho một điều kiện cụ thể trong ba khả năng. Thêm mệnh đề else để chính xác hơn, và xóa file để kiểm tra hoàn toàn mã mới này:
[student@studentvm1 testdir]$ File="TestFile1" ; rm $File ; if [ -s $File ] ; then echo "$File exists and contains data." ; else echo "$File does not exist or is empty." ; fi
TestFile1 does not exist or is empty.
Bây giờ tạo một file rỗng để kiểm tra:
[student@studentvm1 testdir]$ File="TestFile1" ; touch $File ; if [ -s $File ] ; then echo "$File exists and contains data." ; else echo "$File does not exist or is empty." ; fi
TestFile1 does not exist or is empty.
Thêm nội dung vào file và kiểm tra lại:
[student@studentvm1 testdir]$ File="TestFile1" ; echo "This is file $File" > $File ; if [ -s $File ] ; then echo "$File exists and contains data." ; else echo "$File does not exist or is empty." ; fi
TestFile1 exists and contains data.
Bây giờ, thêm mệnh đề elif để phân biệt giữa file không tồn tại và file rỗng:
[student@studentvm1 testdir]$ File="TestFile1" ; touch $File ; if [ -s $File ] ; then echo "$File exists and contains data." ; elif [ -e $File ] ; then echo "$File exists and is empty." ; else echo "$File does not exist." ; fi
TestFile1 exists and is empty.
[student@studentvm1 testdir]$ File="TestFile1" ; echo "This is $File" > $File ; if [ -s $File ] ; then echo "$File exists and contains data." ; elif [ -e $File ] ; then echo "$File exists and is empty." ; else echo "$File does not exist." ; fi
TestFile1 exists and contains data.
[student@studentvm1 testdir]$
Bây giờ bạn có một chương trình CLI Bash có thể kiểm tra ba điều kiện khác nhau… nhưng khả năng là vô hạn.
Dễ dàng hơn để thấy cấu trúc logic của các lệnh phức hợp phức tạp nếu bạn sắp xếp các câu lệnh chương trình giống như trong script lưu trong file. Hình 2 cho thấy cách này trông như thế nào. Các thụt lề của câu lệnh chương trình trong từng mệnh đề của cấu trúc if-elif-else giúp làm rõ logic.
File="TestFile1"
echo "This is $File" > $File
if [ -s $File ]
then
echo "$File exists and contains data."
elif [ -e $File ]
then
echo "$File exists and is empty."
else
echo "$File does not exist."
fi
Hình 2: Chương trình dòng lệnh được viết lại như trong script
Logic phức tạp như vậy quá dài cho hầu hết chương trình CLI. Mặc dù mọi lệnh built-in của Linux hoặc Bash đều có thể sử dụng trong chương trình CLI, nhưng khi chương trình càng dài và phức tạp, việc tạo script lưu trong file và có thể thực thi bất cứ lúc nào thì hợp lý hơn.
Toán tử so sánh chuỗi
Toán tử so sánh chuỗi cho phép so sánh các chuỗi ký tự alphanumeric. Chỉ có một vài toán tử này, được liệt kê trong Hình 3.
| Toán tử | Mô tả |
|---|---|
| -z string | True nếu độ dài chuỗi bằng không |
| -n string | True nếu độ dài chuỗi khác không |
| string1 == string2 hoặc string1 = string2 |
True nếu các chuỗi bằng nhau; đơn = nên dùng với lệnh test để tuân thủ POSIX. Khi dùng với lệnh [[, thực hiện khớp mẫu như mô tả (lệnh hợp thành). |
| string1 != string2 | True nếu các chuỗi không bằng nhau |
| string1 < string2 | True nếu string1 sắp xếp trước string2 theo thứ tự từ điển (tham chiếu trình tự sắp xếp locale-specific cho mọi ký tự alphanumeric và đặc biệt) |
| string1 > string2 | True nếu string1 sắp xếp sau string2 theo thứ tự từ điển |
Hình 3: Các toán tử logic chuỗi Bash
Trước tiên, xem độ dài chuỗi. Dấu ngoặc kép quanh $MyVar trong so sánh phải có mặt để so sánh hoạt động. (Bạn vẫn nên làm việc trong ~/testdir.)
[student@studentvm1 testdir]$ MyVar="" ; if [ -z "" ] ; then echo "MyVar is zero length." ; else echo "MyVar contains data" ; fi
MyVar is zero length.
[student@studentvm1 testdir]$ MyVar="Random text" ; if [ -z "" ] ; then echo "MyVar is zero length." ; else echo "MyVar contains data" ; fi
MyVar is zero length.
Bạn cũng có thể làm cách này:
[student@studentvm1 testdir]$ MyVar="Random text" ; if [ -n "$MyVar" ] ; then echo "MyVar contains data." ; else echo "MyVar is zero length" ; fi
MyVar contains data.
[student@studentvm1 testdir]$ MyVar="" ; if [ -n "$MyVar" ] ; then echo "MyVar contains data." ; else echo "MyVar is zero length" ; fi
MyVar is zero length
Đôi khi bạn có thể cần biết độ dài chính xác của chuỗi. Đây không phải là so sánh, nhưng có liên quan. Rất tiếc, không có cách đơn giản để xác định độ dài chuỗi. Có vài cách làm, nhưng tác giả nghĩ dùng lệnh expr (đánh giá biểu thức) là dễ nhất. Đọc man page expr để biết thêm. Lưu ý dấu ngoặc kép bắt buộc quanh chuỗi hoặc biến bạn kiểm tra.
[student@studentvm1 testdir]$ MyVar="" ; expr length "$MyVar"
0
[student@studentvm1 testdir]$ MyVar="How long is this?" ; expr length "$MyVar"
17
[student@studentvm1 testdir]$ expr length "We can also find the length of a literal string as well as a variable."
70
Về toán tử so sánh, tác giả sử dụng nhiều kiểm tra trong script để xác định hai chuỗi có bằng nhau (tức là giống hệt). Sử dụng phiên bản non-POSIX của toán tử so sánh này:
[student@studentvm1 testdir]$ Var1="Hello World" ; Var2="Hello World" ; if [ "$Var1" == "$Var2" ] ; then echo "Var1 matches Var2" ; else echo "Var1 and Var2 do not match." ; fi
Var1 matches Var2
[student@studentvm1 testdir]$ Var1="Hello World" ; Var2="Hello world" ; if [ "$Var1" == "$Var2" ] ; then echo "Var1 matches Var2" ; else echo "Var1 and Var2 do not match." ; fi
Var1 and Var2 do not match.
Hãy tự thử nghiệm thêm với các toán tử này.
Toán tử so sánh số
Toán tử số thực hiện so sánh giữa hai đối số số. Giống như các lớp toán tử khác, hầu hết dễ hiểu.
| Toán tử | Mô tả |
|---|---|
| arg1 -eq arg2 | True nếu arg1 bằng arg2 |
| arg1 -ne arg2 | True nếu arg1 không bằng arg2 |
| arg1 -lt arg2 | True nếu arg1 nhỏ hơn arg2 |
| arg1 -le arg2 | True nếu arg1 nhỏ hơn hoặc bằng arg2 |
| arg1 -gt arg2 | True nếu arg1 lớn hơn arg2 |
| arg1 -ge arg2 | True nếu arg1 lớn hơn hoặc bằng arg2 |
Hình 4: Các toán tử logic so sánh số Bash
Dưới đây là một số ví dụ đơn giản. Lần đầu thiết lập biến $X thành 1, sau đó kiểm tra xem $X có bằng 1 không. Lần hai, X được đặt thành 0, nên so sánh không đúng.
[student@studentvm1 testdir]$ X=1 ; if [ $X -eq 1 ] ; then echo "X equals 1" ; else echo "X does not equal 1" ; fi
X equals 1
[student@studentvm1 testdir]$ X=0 ; if [ $X -eq 1 ] ; then echo "X equals 1" ; else echo "X does not equal 1" ; fi
X does not equal 1
[student@studentvm1 testdir]$
Hãy tự thử thêm các thí nghiệm.
Toán tử hỗn hợp
Các toán tử hỗn hợp này cho biết xem một tùy chọn shell có được thiết lập hay một biến shell có giá trị, nhưng không khám phá giá trị của biến, chỉ biết nó có giá trị hay không.
| Toán tử | Mô tả |
|---|---|
| -o optname | True nếu tùy chọn shell optname được bật (xem danh sách tùy chọn dưới mô tả tùy chọn -o của Bash set builtin trong man page Bash) |
| -v varname | True nếu biến shell varname được thiết lập (đã gán giá trị) |
| -R varname | True nếu biến shell varname được thiết lập và là tham chiếu tên |
Hình 5: Các toán tử logic Bash hỗn hợp
Hãy tự thử nghiệm các toán tử này.
Mở rộng (Expansions)
Bash hỗ trợ nhiều loại mở rộng và thay thế có thể rất hữu ích. Theo man page Bash, Bash có bảy dạng mở rộng. Bài viết này xem xét năm trong số đó: mở rộng tilde, mở rộng số học, mở rộng tên đường dẫn, mở rộng brace và thay thế lệnh.
Mở rộng Brace
Mở rộng brace là phương pháp tạo ra các chuỗi tùy ý. (Công cụ này được dùng dưới đây để tạo số lượng lớn file cho thí nghiệm với ký tự mẫu đặc biệt.) Mở rộng brace có thể tạo danh sách các chuỗi tùy ý và chèn chúng vào vị trí cụ thể trong chuỗi tĩnh bao quanh hoặc ở một trong hai đầu chuỗi tĩnh. Điều này có thể khó hình dung, nên tốt nhất là thực hành.
Trước đây, đây là những gì mở rộng brace làm:
[student@studentvm1 testdir]$ echo {string1,string2,string3}
string1 string2 string3
Vâng, điều đó không quá hữu ích, phải không? Nhưng xem điều gì xảy ra khi bạn dùng nó hơi khác:
[student@studentvm1 testdir]$ echo "Hello "{David,Jen,Rikki,Jason}.
Hello David. Hello Jen. Hello Rikki. Hello Jason.
Trông giống như cái hữu ích—có thể tiết kiệm nhiều gõ phím. Bây giờ thử cái này:
[student@studentvm1 testdir]$ echo b{ed,olt,ar}s
beds bolts bars
Tác giả có thể tiếp tục, nhưng bạn đã hiểu ý.
Mở rộng Tilde
Có lẽ mở rộng phổ biến nhất là mở rộng tilde (~). Khi bạn dùng nó trong lệnh như cd ~/Documents, shell Bash mở rộng nó như một lối tắt đến thư mục home đầy đủ của người dùng.
Sử dụng các chương trình Bash này để quan sát hiệu ứng của mở rộng tilde:
[student@studentvm1 testdir]$ echo ~
/home/student
[student@studentvm1 testdir]$ echo ~/Documents
/home/student/Documents
[student@studentvm1 testdir]$ Var1=~/Documents ; echo $Var1 ; cd $Var1
/home/student/Documents
[student@studentvm1 Documents]$
Mở rộng tên đường dẫn
Mở rộng tên đường dẫn là thuật ngữ fancy cho việc mở rộng các mẫu file-globbing, sử dụng ký tự ? và *, thành tên đầy đủ của thư mục khớp với mẫu. File globbing đề cập đến các ký tự mẫu đặc biệt cho phép linh hoạt đáng kể trong việc khớp tên file, thư mục và chuỗi khác khi thực hiện các hành động. Các ký tự mẫu đặc biệt này cho phép khớp ký tự đơn, nhiều hoặc cụ thể trong chuỗi.
- ? — Chỉ khớp một ký tự bất kỳ tại vị trí chỉ định trong chuỗi
- * — Khớp không hoặc nhiều ký tự bất kỳ tại vị trí chỉ định trong chuỗi
Mở rộng này được áp dụng cho tên thư mục khớp. Để xem cách hoạt động, đảm bảo testdir là thư mục làm việc hiện tại (PWD) và bắt đầu với danh sách đơn giản (nội dung thư mục home của tác giả sẽ khác với của bạn):
[student@studentvm1 testdir]$ ls
chapter6 cpuHog.dos dmesg1.txt Documents Music softlink1 testdir6 Videos
chapter7 cpuHog.Linux dmesg2.txt Downloads Pictures Templates testdir
testdir cpuHog.mac dmesg3.txt file005 Public testdir tmp
cpuHog Desktop dmesg.txt link3 random.txt testdir1 umask.test
[student@studentvm1 testdir]$
Bây giờ liệt kê thư mục bắt đầu bằng Do, testdir/Documents và testdir/Downloads:
Documents:
Directory01 file07 file15 test02 test10 test20 testfile13 TextFiles
Directory02 file08 file16 test03 test11 testfile01 testfile14
file01 file09 file17 test04 test12 testfile04 testfile15
file02 file10 file18 test05 test13 testfile05 testfile16
file03 file11 file19 test06 test14 testfile09 testfile17
file04 file12 file20 test07 test15 testfile10 testfile18
file05 file13 Student1.txt test08 test16 testfile11 testfile19
file06 file14 test01 test09 test18 testfile12 testfile20
Downloads:
[student@studentvm1 testdir]$
Vâng, đó không phải điều bạn muốn. Nó liệt kê nội dung của thư mục bắt đầu bằng Do. Để chỉ liệt kê thư mục chứ không phải nội dung, dùng tùy chọn -d.
[student@studentvm1 testdir]$ ls -d Do*
Documents Downloads
[student@studentvm1 testdir]$
Trong cả hai trường hợp, shell Bash mở rộng mẫu Do* thành tên của hai thư mục khớp mẫu. Nhưng nếu cũng có file khớp mẫu thì sao?
[student@studentvm1 testdir]$ touch Downtown ; ls -d Do*
Documents Downloads Downtown
[student@studentvm1 testdir]$
Điều này cũng hiển thị file. Vì vậy bất kỳ file nào khớp mẫu cũng được mở rộng thành tên đầy đủ.
Thay thế lệnh (Command substitution)
Thay thế lệnh là dạng mở rộng cho phép luồng dữ liệu STDOUT của một lệnh được dùng làm đối số của lệnh khác; ví dụ, như danh sách mục để xử lý trong vòng lặp. Man page Bash nói: "Thay thế lệnh cho phép đầu ra của một lệnh thay thế tên lệnh." Tác giả thấy điều đó chính xác dù hơi khó hiểu.
Có hai dạng thay thế này, `command` và $(command). Trong dạng cũ dùng backtick (`), việc dùng backslash (\) trong lệnh giữ nguyên nghĩa đen. Tuy nhiên, khi dùng trong dạng ngoặc đơn mới, backslash mang ý nghĩa ký tự đặc biệt. Lưu ý dạng ngoặc đơn chỉ dùng ngoặc đơn để mở và đóng câu lệnh.
Tác giả thường dùng khả năng này trong chương trình dòng lệnh và script nơi kết quả của lệnh này dùng làm đối số cho lệnh khác.
Bắt đầu với ví dụ rất đơn giản dùng cả hai dạng mở rộng này (lại đảm bảo testdir là PWD):
[student@studentvm1 testdir]$ echo "Todays date is `date`"
Todays date is Sun Apr 7 14:42:46 EDT 2019
[student@studentvm1 testdir]$ echo "Todays date is $(date)"
Todays date is Sun Apr 7 14:42:59 EDT 2019
[student@studentvm1 testdir]$
Tùy chọn -w của tiện ích seq thêm số 0 dẫn đầu vào các số tạo ra để chúng cùng chiều rộng, tức là cùng số chữ số bất kể giá trị. Điều này dễ sắp xếp theo trình tự số.
Tiện ích seq dùng để tạo dãy số:
[student@studentvm1 testdir]$ seq 5
1
2
3
4
5
[student@studentvm1 testdir]$ echo `seq 5`
1 2 3 4 5
[student@studentvm1 testdir]$
Bây giờ bạn có thể làm điều hữu ích hơn, như tạo số lượng lớn file rỗng để kiểm tra:
[student@studentvm1 testdir]$ for I in $(seq -w 5000) ; do touch file-$I ; done
Trong cách dùng này, câu lệnh seq -w 5000 tạo danh sách số từ 1 đến 5.000. Bằng cách dùng thay thế lệnh như một phần của câu lệnh for, danh sách số được dùng bởi câu lệnh for để tạo phần số của tên file.
Mở rộng số học
Bash có thể thực hiện toán học nguyên, nhưng khá rườm rà (như bạn sẽ thấy ngay). Cú pháp mở rộng số học là $((arithmetic-expression)), dùng ngoặc kép để mở và đóng biểu thức.
Mở rộng số học hoạt động như thay thế lệnh trong chương trình shell hoặc script; giá trị tính từ biểu thức thay thế biểu thức để shell đánh giá tiếp.
Một lần nữa, bắt đầu với cái đơn giản:
[student@studentvm1 testdir]$ echo $((1+1))
2
[student@studentvm1 testdir]$ Var1=5 ; Var2=7 ; Var3=$((Var1*Var2)) ; echo "Var 3 = $Var3"
Var 3 = 35
Phép chia sau đây cho kết quả 0 vì kết quả sẽ là giá trị thập phân nhỏ hơn 1:
[student@studentvm1 testdir]$ Var1=5 ; Var2=7 ; Var3=$((Var1/Var2)) ; echo "Var 3 = $Var3"
Var 3 = 0
Đây là một phép tính đơn giản tác giả thường làm trong script hoặc chương trình CLI cho biết tổng bộ nhớ ảo trong host Linux. Lệnh free không cung cấp dữ liệu đó:
[student@studentvm1 testdir]$ RAM=`free | grep ^Mem | awk '{print $2}'` ; Swap=`free | grep ^Swap | awk '{print $2}'` ; echo "RAM = $RAM and Swap = $Swap" ; echo "Total Virtual memory is $((RAM+Swap))" ;
RAM = 4037080 and Swap = 6291452
Total Virtual memory is 10328532
Tác giả dùng ký tự ` để phân tách các đoạn mã dùng cho thay thế lệnh.
Tác giả dùng mở rộng số học Bash chủ yếu để kiểm tra lượng tài nguyên hệ thống trong script và chọn đường dẫn thực thi chương trình dựa trên kết quả.
Tóm tắt
Bài viết này, bài thứ hai trong chuỗi về Bash như ngôn ngữ lập trình, đã khám phá các toán tử logic file, chuỗi, số và hỗn hợp của Bash cung cấp logic điều khiển luồng thực thi và các loại mở rộng shell khác nhau.
Bài viết thứ ba trong chuỗi sẽ khám phá việc sử dụng vòng lặp để thực hiện các loại thao tác lặp lại khác nhau.