ShellScript - Tiếp Diễn (P4)

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:

$(( biểu thức ))

Ví dụ:

#!/bin/bash

a=$(( 5 + 5 )) #line 3
echo $a #10

a=$((7+5)) #line 6
echo $a #12

b=$(( a + 3 )) #line 9
echo $b #15

b=$(( $a + 4 )) #line 12
echo $b #16

(( b++ )) #line 15
echo $b #17

(( b += 3 )) #line 18
echo $b #20
  • 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:

${#variable}

Ví dụ:

#!/bin/bash

a='Hello'
echo ${#a} # 5
b=4567
echo ${#b} # 4

🔻 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:
if [ <some condition> ]
then
<command>
fi
  • Bất cứ câu lệnh nào đặt giữa thenfi sẽ được thực hiện nếu điều kiện trả về true.
  • Ví dụ:
#!/bin/bash

if [ $1 -gt 50 ] #line 3
then
echo Amazingggg. #line 5
fi
  • 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."
➜  ~ ./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ột path. Một path - đườ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ụ:
➜  ~ test 005 = 5
➜  ~ echo $?
1 #false
➜  ~ test 005 -eq 5
➜  ~ echo $?       
0 #true

▪️ 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ụ:
#!/bin/bash

if [ $1 -gt 50 ] #line 3
then

if (( $1 % 2 == 0 )) #line 6
then
echo Congratulations. #line 8
fi
fi
  • 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:
if [ <some condition> ]
then
<command>
else
<other command>
fi
  • Ví dụ:
#!/bin/bash

if [ $1 -eq 1 ]
then
echo This Good
else
echo This Bad
fi

▪️ 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:
if [ <some condition> ]
then
<command>
elif [ <some condition> ] 
then
<different command>
else
<other command>
fi
  • Ví dụ:
#!/bin/bash

if [ $1 -ge 20 ]
then
echo The Flower
elif [ $1 = 10 ]
then
echo Good boy.
else
echo Thank you
fi
  • 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ọn else.

▪️ Toán tử Boolean

  • Toán tử này bao gồm: and - &&or- ||
  • Ví dụ:
#!/bin/bash
#and_operator
if [ $1 -ge 5 ] && [ $2 -le 10 ]
then
echo Correct.
fi
#!/bin/bash
#or_operator
if [ $1 -ge 5 ] || [ $2 -le 10 ]
then
echo Correct.
else
echo Bad.
fi

▪️ Nhắc lại câu lệnh Case

  • Về cơ bản, ifcase khá giống nhau. Tuy nhiên, ta thường sử dụng case trong bài toán dạng mul-ti choice + biểu thức đơn giản, còn if 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:
case <variable> in
<value 1>)
<commands>
;;
<value 2>)
<other commands>
;;
esac
  • Ví dụ:
#!/bin/bash

case $1 in #line 3
yellow) #line 4
echo This is yellow
;; #line 6
red)
echo This is red
;;
black)
echo This is black
;;
*) #line 13
echo Make color
;;
esac #line 16
  • 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 $1yellow 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: esaccho biết ta đang ở cuối câu lệnh case. Bất kỳ câu lệnh khác nào sau nó sẽ được thực hiện bình thường.

Trên đây mình đã tìm hiểu thêm về ArithmeticIf Else. Mình xin kết thúc phần 4 tại đây.
Cảm ơn các bạn đã đọc bài viết!