Chúng ta tiếp tục cùng tìm hiểu những phần tiếp theo của shell script nhé !
Số học (Arithmetic) (tiếp)
Sử dụng 2 lần dấu ngoặc đơn
(( ))
, cú pháp:
1 2 | $(( biểu thức )) |
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token shebang important">#!/bin/bash</span> a<span class="token operator">=</span><span class="token variable"><span class="token variable">$((</span> <span class="token number">5</span> <span class="token operator">+</span> <span class="token number">5</span> <span class="token variable">))</span></span> <span class="token comment">#line 3</span> <span class="token keyword">echo</span> <span class="token variable">$a</span> <span class="token comment">#10</span> a<span class="token operator">=</span><span class="token variable"><span class="token variable">$((</span><span class="token number">7</span><span class="token operator">+</span><span class="token number">5</span><span class="token variable">))</span></span> <span class="token comment">#line 6</span> <span class="token keyword">echo</span> <span class="token variable">$a</span> <span class="token comment">#12</span> b<span class="token operator">=</span><span class="token variable"><span class="token variable">$((</span> a <span class="token operator">+</span> <span class="token number">3</span> <span class="token variable">))</span></span> <span class="token comment">#line 9</span> <span class="token keyword">echo</span> <span class="token variable">$b</span> <span class="token comment">#15</span> b<span class="token operator">=</span><span class="token variable"><span class="token variable">$((</span> $a <span class="token operator">+</span> <span class="token number">4</span> <span class="token variable">))</span></span> <span class="token comment">#line 12</span> <span class="token keyword">echo</span> <span class="token variable">$b</span> <span class="token comment">#16</span> <span class="token variable"><span class="token punctuation">((</span> b<span class="token operator">++</span> <span class="token punctuation">))</span></span> <span class="token comment">#line 15</span> <span class="token keyword">echo</span> <span class="token variable">$b</span> <span class="token comment">#17</span> <span class="token variable"><span class="token punctuation">((</span> b <span class="token operator">+</span><span class="token operator">=</span> <span class="token number">3</span> <span class="token punctuation">))</span></span> <span class="token comment">#line 18</span> <span class="token keyword">echo</span> <span class="token variable">$b</span> <span class="token comment">#20</span> |
- Dòng 3 – Đây là định dạng cơ bản, ta có thể sắp xếp nó một cách dễ dàng mà không cần trích dẫn.
- Dòng 6 – Nó hoạt động tương tự nếu ta viết không có khoảng trắng.
- Dòng 9 – Ta có thể viết bao gồm các biến mà không có dấu $ đằng trước.
- Dòng 12 – Các biến có thể được bao gồm với dấu $ nếu ta muốn.
- Dòng 15 – Ở đây giá trị của biến b được tăng thêm 1. Khi ta làm điều này, ta không cần dấu $ trước dấu ngoặc.
- Dòng 18 – Ở đây giá trị của biến b được tăng thêm 3. Nó là cách viết ngắn hơn của
b = b + 3
.
Độ dài của một biến, cú pháp:
1 2 | ${#variable} |
Ví dụ:
1 2 3 4 5 6 7 | <span class="token shebang important">#!/bin/bash</span> a<span class="token operator">=</span><span class="token string">'Hello'</span> <span class="token keyword">echo</span> <span class="token variable">${#a}</span> <span class="token comment"># 5</span> b<span class="token operator">=</span>4567 <span class="token keyword">echo</span> <span class="token variable">${#b}</span> <span class="token comment"># 4</span> |
Câu lệnh IF
Chúng ta sẽ tìm hiểu sâu hơn về câu lệnh
if
nhé
- Các câu lệnh
if
cho phép chúng ta đưa ra quyết định trong các tập lệnh Bash của chúng ta. Nó cho phép ta quyết định có chạy mã hay không dựa trên các điều kiện mà ta có thể đặt.
Câu lệnh IF cơ bản
- Một câu lệnh if cơ bản sẽ check: nếu một điều kiện cụ thế trả về true thì nó sẽ thực hiện một tập hợp các hành động nhất định.Nếu không nó sẽ không thực hiện các hành động đó, cú pháp như sau:
1 2 3 4 5 | <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token operator"><</span>some condition<span class="token operator">></span> <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token operator"><</span>command<span class="token operator">></span> <span class="token keyword">fi</span> |
- Bất cứ câu lệnh nào đặt giữa
then
vàfi
sẽ được thực hiện nếu điều kiện trả về true. - Ví dụ:
1 2 3 4 5 6 7 | <span class="token shebang important">#!/bin/bash</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$1</span> -gt 50 <span class="token punctuation">]</span> <span class="token comment">#line 3</span> <span class="token keyword">then</span> <span class="token keyword">echo</span> Amazingggg. <span class="token comment">#line 5</span> <span class="token keyword">fi</span> |
- Dòng 3 – ở đây, sẽ check xem biến truyền vào đầu tiên có lớn hơn 50 hay không
- Dòng 5 – Nếu biến truyền vào lớn hơn 50, sẽ cho echo ra màn hình text “Amazingggg.”
1 2 3 4 | ➜ ~ ./test.sh 55 Amazingggg. ➜ ~ ./test.sh 2 |
Toán tử (Operator)
Toán tử | Mô tả |
---|---|
!condition | nếu condition là true thì sẽ trả về false và ngược lại |
-n string | độ dài của string lớn hơn 0 |
-z string | độ dài của string bằng 0 (tức là rỗng) |
string1 = string2 | string1 bằng string2 |
string1 != string2 | hai string không giống nhau |
integer1 -eq integer2 | integer1 bằng integer2 |
integer1 -gt integer2 | integer1 lớn hơn integer2 |
integer1 -lt integer2 | integer1 nhỏ hơn integer2 |
-d file | file tồn tại và là một thư mục |
-e file | file tồn tại |
-r file | file tồn tại và được quyền đọc |
-s file | file tồn tại và kích thước của nó lớn hơn 0 |
-w file | file tồn tại và được quyền viết |
- Lưu ý:
=
hơi khác so với-eq
, ví dụ[005 = 5]
sẽ trả về false, còn[005 -eq 5]
sẽ trả về true.- Khi ta đề cập đến
file
bên trên sẽ được hiểu là mộtpath
. Mộtpath
– đường dẫn có thể là tuyệt đối hoặc tương đối và có thể tham chiếu đến một tệp hoặc một thư mục. - ta có thể dùng command
test
để test thử các trường hợp ta đề cập đến, ví dụ:
1 2 3 4 5 6 7 | ➜ ~ <span class="token function">test</span> 005 <span class="token operator">=</span> 5 ➜ ~ <span class="token keyword">echo</span> <span class="token variable">$?</span> 1 <span class="token comment">#false</span> ➜ ~ <span class="token function">test</span> 005 -eq 5 ➜ ~ <span class="token keyword">echo</span> <span class="token variable">$?</span> 0 <span class="token comment">#true</span> |
Câu lệnh if lồng nhau
- Ta có thể có nhiều câu lệnh
if
trong tập lệnh của mình. Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token shebang important">#!/bin/bash</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$1</span> -gt 50 <span class="token punctuation">]</span> <span class="token comment">#line 3</span> <span class="token keyword">then</span> <span class="token keyword">if</span> <span class="token variable"><span class="token punctuation">((</span> $<span class="token number">1</span> <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">))</span></span> <span class="token comment">#line 6</span> <span class="token keyword">then</span> <span class="token keyword">echo</span> Congratulations. <span class="token comment">#line 8</span> <span class="token keyword">fi</span> <span class="token keyword">fi</span> |
- Dòng 3 – Thực hiện khi tham số đầu tiên truyền vào lớn hơn 50
- Dòng 6 – Nếu ta muốn kiểm tra một biểu thức ta có thể sử dụng 2 lần mở đóng ngoặc như trên
- Dòng 8 – Sẽ chạy nếu biểu thức dòng 6 trả về true
Câu lệnh if else
- Trong những trường hợp ta muốn thực hiện một số hành động nhất định nếu điều kiện trong
[]
trả về true và những hành động khác nếu trả về false, ta có thể viết theo dạng:
1 2 3 4 5 6 7 | <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token operator"><</span>some condition<span class="token operator">></span> <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token operator"><</span>command<span class="token operator">></span> <span class="token keyword">else</span> <span class="token operator"><</span>other command<span class="token operator">></span> <span class="token keyword">fi</span> |
- Ví dụ:
1 2 3 4 5 6 7 8 9 | <span class="token shebang important">#!/bin/bash</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$1</span> -eq 1 <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token keyword">echo</span> This Good <span class="token keyword">else</span> <span class="token keyword">echo</span> This Bad <span class="token keyword">fi</span> |
Câu lệnh if elif else
- Ta có thể thêm được nhiều điều kiện để có thể dẫn đến các kết quả khác nhau , bằng cách sử dụng
if elif else
. Cú pháp:
1 2 3 4 5 6 7 8 9 10 | <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token operator"><</span>some condition<span class="token operator">></span> <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token operator"><</span>command<span class="token operator">></span> <span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token operator"><</span>some condition<span class="token operator">></span> <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token operator"><</span>different command<span class="token operator">></span> <span class="token keyword">else</span> <span class="token operator"><</span>other command<span class="token operator">></span> <span class="token keyword">fi</span> |
- Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token shebang important">#!/bin/bash</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$1</span> -ge 20 <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token keyword">echo</span> The Flower <span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token variable">$1</span> <span class="token operator">=</span> 10 <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token keyword">echo</span> Good boy. <span class="token keyword">else</span> <span class="token keyword">echo</span> Thank you <span class="token keyword">fi</span> |
- Ta có thể có nhiều nhánh
elif
nếu muốn. Và kết thúc sẽ sử dụng tùy chọnelse
.
Toán tử Boolean
- Toán tử này bao gồm:
and - &&
vàor- ||
- Ví dụ:
1 2 3 4 5 6 7 | <span class="token shebang important">#!/bin/bash</span> <span class="token comment">#and_operator</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$1</span> -ge 5 <span class="token punctuation">]</span> <span class="token operator">&&</span> <span class="token punctuation">[</span> <span class="token variable">$2</span> -le 10 <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token keyword">echo</span> Correct. <span class="token keyword">fi</span> |
1 2 3 4 5 6 7 8 9 | <span class="token shebang important">#!/bin/bash</span> <span class="token comment">#or_operator</span> <span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$1</span> -ge 5 <span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">[</span> <span class="token variable">$2</span> -le 10 <span class="token punctuation">]</span> <span class="token keyword">then</span> <span class="token keyword">echo</span> Correct. <span class="token keyword">else</span> <span class="token keyword">echo</span> Bad. <span class="token keyword">fi</span> |
Nhắc lại câu lệnh
Case
- Về cơ bản,
if
vàcase
khá giống nhau. Tuy nhiên, ta thường sử dụngcase
trong bài toán dạng mul-ti choice + biểu thức đơn giản, cònif
sẽ dùng cho các bài toán ít trường hợp và sử dụng biểu thức phức tạp - Cú pháp sử dụng
case
:
1 2 3 4 5 6 7 8 9 | <span class="token keyword">case</span> <span class="token operator"><</span>variable<span class="token operator">></span> <span class="token keyword">in</span> <span class="token operator"><</span>value 1<span class="token operator">></span><span class="token punctuation">)</span> <span class="token operator"><</span>commands<span class="token operator">></span> <span class="token punctuation">;</span><span class="token punctuation">;</span> <span class="token operator"><</span>value 2<span class="token operator">></span><span class="token punctuation">)</span> <span class="token operator"><</span>other commands<span class="token operator">></span> <span class="token punctuation">;</span><span class="token punctuation">;</span> esac |
- Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token shebang important">#!/bin/bash</span> <span class="token keyword">case</span> <span class="token variable">$1</span> <span class="token keyword">in</span> <span class="token comment">#line 3</span> yellow<span class="token punctuation">)</span> <span class="token comment">#line 4</span> <span class="token keyword">echo</span> This is yellow <span class="token punctuation">;</span><span class="token punctuation">;</span> <span class="token comment">#line 6</span> red<span class="token punctuation">)</span> <span class="token keyword">echo</span> This is red <span class="token punctuation">;</span><span class="token punctuation">;</span> black<span class="token punctuation">)</span> <span class="token keyword">echo</span> This is black <span class="token punctuation">;</span><span class="token punctuation">;</span> *<span class="token punctuation">)</span> <span class="token comment">#line 13</span> <span class="token keyword">echo</span> Make color <span class="token punctuation">;</span><span class="token punctuation">;</span> esac <span class="token comment">#line 16</span> |
- Dòng 3: Dòng này bắt đầu thực thi lênh
case
- Dòng 4: Nếu biến truyền vào đầu tiên
$1
làyellow
sẽ thực thi lệnh bên trong nó. Dấu)
thể hiện việc kết thúc các trường hợp. - Dòng 6: Ta xác định kết thúc của tập hợp câu lệnh này bằng dấu
;;
- Dòng 13: Dấu
*
đại diện cho bất kỳ ký tự nào, ta có thể coi đây là default nếu biến truyền vào không rơi vào bất cứ trường hợp nào - Dòng 16:
esac
cho biết ta đang ở cuối câu lệnhcase
. Bất kỳ câu lệnh khác nào sau nó sẽ được thực hiện bình thường.