Trong chương này, sẽ thảo luận chi tiết về biến đặc biệt trong Unix. Trong một trong những chương trước, sử dụng một số ký tự không và số trong tên biến. Điều này là do những ký tự đó được sử dụng trong tên của các biến Unix đặc biệt. Các biến này được dành riêng cho các chức năng cụ thể. Ví dụ: ký tự $ đại diện cho số ID quy trình, hoặc PID, của trình bao hiện tại
$echo $$
Lệnh trên ghi PID của shell hiện tại –
29949
Bảng sau đây cho thấy một số biến đặc biệt mà bạn có thể sử dụng trong các tập lệnh shell của mình:
Sr.No. | Biến & Mô tả |
1 | $ 0 Tên tệp của tập lệnh hiện tại. |
2 | $ n Các biến này tương ứng với các đối số mà một tập lệnh đã được gọi. Ở đây n là một số thập phân dương tương ứng với vị trí của một đối số (đối số đầu tiên là $ 1, đối số thứ hai là $ 2, v.v.). |
3 | $ # Số lượng đối số được cung cấp cho một tập lệnh. |
4 | $ * Tất cả các đối số được trích dẫn kép. Nếu một tập lệnh nhận được hai đối số, thì $ * tương đương với $ 1 $ 2. |
5 | $ @ Tất cả các đối số được trích dẫn kép riêng lẻ. Nếu một tập lệnh nhận được hai đối số, thì $ @ tương đương với $ 1 $ 2. |
6 | $? Trạng thái thoát của lệnh cuối cùng được thực thi. |
7 | $$ Số quá trình của trình bao hiện tại. Đối với các tập lệnh shell, đây là ID tiến trình mà chúng đang thực thi. |
số 8 | $! Số tiến trình của lệnh nền cuối cùng. |
Đối số dòng lệnh
Các đối số dòng lệnh $ 1, $ 2, $ 3, … $ 9 là các tham số vị trí, với $ 0 trỏ đến lệnh thực, chương trình, tập lệnh shell hoặc hàm và $ 1, $ 2, $ 3, … $ 9 là các đối số của yêu cầu.
Tập lệnh sau sử dụng các biến đặc biệt khác nhau liên quan đến dòng lệnh:
#!/bin/sh
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
Đây là một lần chạy mẫu cho tập lệnh trên –
$./test.sh dongthoigian
File Name : ./test.sh
First Parameter : dongthoi
Second Parameter : gian
Quoted Values: dongthoigian
Quoted Values: dongthoigian
Total Number of Parameters : 2
Các thông số đặc biệt $ * và $ @
Có các tham số đặc biệt cho phép truy cập tất cả các đối số dòng lệnh cùng một lúc. $ * và $ @ cả hai sẽ hoạt động giống nhau trừ khi chúng được đặt trong dấu ngoặc kép, “” .
Cả hai tham số chỉ định các đối số dòng lệnh. Tuy nhiên, tham số đặc biệt “$ *” nhận toàn bộ danh sách dưới dạng một đối số với khoảng trắng giữa và tham số đặc biệt “$ @” nhận toàn bộ danh sách và tách nó thành các đối số riêng biệt. Chúng ta có thể viết tập lệnh shell như được hiển thị bên dưới để xử lý một số lượng đối số dòng lệnh không xác định với các tham số đặc biệt $ * hoặc $ @ –
#!/bin/sh
for TOKEN in $*
do
echo $TOKEN
done
Đây là một lần chạy mẫu cho tập lệnh trên –
$./test.sh dongthoigian 10 Years Old
dongthoi
gian
10
Years
Old
Lưu ý – Đây do … done là một loại vòng lặp sẽ được đề cập trong hướng dẫn tiếp theo.
Trạng thái thoát
$ ? biến đại diện cho trạng thái thoát của lệnh trước đó.
Trạng thái thoát là một giá trị số được trả về bởi mọi lệnh sau khi hoàn thành. Theo quy luật, hầu hết các lệnh trả về trạng thái thoát là 0 nếu chúng thành công và 1 nếu chúng không thành công.
Một số lệnh trả về trạng thái thoát bổ sung vì những lý do cụ thể. Ví dụ: một số lệnh phân biệt giữa các loại lỗi và sẽ trả về các giá trị thoát khác nhau tùy thuộc vào loại lỗi cụ thể.
Sau đây là ví dụ về lệnh thành công:
$./test.sh dongthoigian
File Name : ./test.sh
First Parameter : dongthoi
Second Parameter : gian
Quoted Values: dongthoigian
Quoted Values: dongthoigian
Total Number of Parameters : 2
$echo $?
0
$
Unix / Linux – Sử dụng Mảng Shell
Trong chương này, chúng ta sẽ thảo luận về cách sử dụng mảng shell trong Unix. Một biến shell có đủ khả năng để giữ một giá trị duy nhất. Các biến này được gọi là biến vô hướng.
Shell hỗ trợ một loại biến khác được gọi là biến mảng . Điều này có thể chứa nhiều giá trị cùng một lúc. Mảng cung cấp một phương pháp nhóm một tập hợp các biến. Thay vì tạo tên mới cho mỗi biến được yêu cầu, bạn có thể sử dụng một biến mảng duy nhất lưu trữ tất cả các biến khác.
Tất cả các quy tắc đặt tên được thảo luận cho Biến Shell sẽ được áp dụng trong khi đặt tên mảng.
Xác định giá trị mảng
Sự khác biệt giữa một biến mảng và một biến vô hướng có thể được giải thích như sau.
Giả sử bạn đang cố gắng biểu diễn tên của các sinh viên khác nhau dưới dạng một tập hợp các biến. Mỗi biến riêng lẻ là một biến vô hướng như sau:
NAME01="A"
NAME02="B"
NAME03="C"
NAME04="D"
NAME05="E"
Chúng ta có thể sử dụng một mảng duy nhất để lưu trữ tất cả các tên được đề cập ở trên. Sau đây là phương pháp đơn giản nhất để tạo một biến mảng. Điều này giúp gán một giá trị cho một trong các chỉ số của nó.
array_name[index]=value
Ở đây array_name là tên của mảng, index là chỉ số của mục trong mảng mà bạn muốn đặt và value là giá trị bạn muốn đặt cho mục đó.
Ví dụ, các lệnh sau:
NAME[0]="A"
NAME[1]="B"
NAME[2]="C"
NAME[3]="D"
NAME[4]="E"
Nếu bạn đang sử dụng trình bao ksh , đây là cú pháp khởi tạo mảng:
set -A array_name value1 value2 ... valuen
Nếu bạn đang sử dụng bash shell, đây là cú pháp khởi tạo mảng:
array_name=(value1 ... valuen)
Truy cập giá trị mảng
Sau khi bạn đã đặt bất kỳ biến mảng nào, bạn truy cập nó như sau:
${array_name[index]}
Ở đây array_name là tên của mảng và index là chỉ số của giá trị được truy cập. Sau đây là một ví dụ để hiểu khái niệm –
#!/bin/sh
NAME[0]="A"
NAME[1]="B"
NAME[2]="C"
NAME[3]="D"
NAME[4]="E"
echo "First Index: ${NAME[0]}"
echo "Second Index: ${NAME[1]}"
Ví dụ trên sẽ tạo ra kết quả sau:
$./test.sh
First Index: A
Second Index: B
Bạn có thể truy cập tất cả các mục trong một mảng theo một trong những cách sau:
${array_name[*]}
${array_name[@]}
Ở đây array_name là tên của mảng mà bạn quan tâm. Ví dụ sau sẽ giúp bạn hiểu khái niệm:
#!/bin/sh
NAME[0]="A"
NAME[1]="B"
NAME[2]="C"
NAME[3]="D"
NAME[4]="E"
echo "First Method: ${NAME[*]}"
echo "Second Method: ${NAME[@]}"
Ví dụ trên sẽ tạo ra kết quả sau:
$./test.sh
First Method: ABCDE
Second Method: ABCDE
Unix / Linux – Các toán tử cơ bản của Shell
Có nhiều toán tử khác nhau được hỗ trợ bởi mỗi trình bao. Chúng ta sẽ thảo luận chi tiết về Bourne shell (shell mặc định) trong chương này.
Bây giờ chúng ta sẽ thảo luận về các toán tử sau:
- Toán tử số học
- Toán tử quan hệ
- Toán tử Boolean
- Toán tử chuỗi
- Người điều hành kiểm tra tệp
Bourne shell ban đầu không có bất kỳ cơ chế nào để thực hiện các phép toán số học đơn giản nhưng nó sử dụng các chương trình bên ngoài, awk hoặc expr .
Ví dụ sau đây cho thấy cách cộng hai số:
#!/bin/sh
val=`expr 2 + 2`
echo "Total value : $val"
Tập lệnh trên sẽ tạo ra kết quả sau:
Total value : 4
Các điểm sau đây cần được xem xét khi thêm:
- Phải có khoảng trắng giữa các toán tử và biểu thức. Ví dụ, 2 + 2 là không đúng; nó nên được viết là 2 + 2.
- Biểu thức hoàn chỉnh phải được đặt giữa ” , được gọi là biểu thức backtick.
Toán tử số học
Các toán tử số học sau được hỗ trợ bởi Bourne Shell.
Giả sử biến a giữ 10 và biến b giữ 20 thì –
Các toán tử số học sau được hỗ trợ bởi Bourne Shell.
Giả sử biến a giữ 10 và biến b giữ 20 thì –
Thí dụ
Đây là một ví dụ sử dụng tất cả các toán tử số học
#!/bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
Tập lệnh trên sẽ tạo ra kết quả sau:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b
Các điểm sau đây cần được xem xét khi sử dụng các Toán tử số học:
- Phải có khoảng trắng giữa các toán tử và các biểu thức. Ví dụ, 2 + 2 là không đúng; nó nên được viết là 2 + 2.
- Biểu thức hoàn chỉnh phải được đặt giữa ” , được gọi là dấu phẩy ngược.
- Bạn nên sử dụng \ trên biểu tượng * cho phép nhân.
if … then … fi statement là một câu lệnh ra quyết định đã được giải thích trong chương tiếp theo.
Nhà điều hành | Sự mô tả | Thí dụ |
+ (Bổ sung) | Thêm các giá trị ở hai bên của toán tử | `expr $ a + $ b` sẽ cho 30 |
– (Phép trừ) | Trừ toán hạng bên phải khỏi toán hạng bên trái | `expr $ a – $ b` sẽ cho -10 |
* (Phép nhân) | Nhân các giá trị ở hai bên của toán tử | `expr $ a \ * $ b` sẽ cho 200 |
/ (Phân công) | Chia toán hạng bên trái cho toán hạng bên phải | `expr $ b / $ a` sẽ cho 2 |
% (Mô-đun) | Chia toán hạng bên trái cho toán hạng bên phải và trả về phần dư | `expr $ b% $ a` sẽ cho 0 |
= (Nhiệm vụ) | Gán toán hạng bên phải trong toán hạng bên trái | a = $ b sẽ gán giá trị của b thành a |
== (Bình đẳng) | So sánh hai số, nếu cả hai đều giống nhau thì trả về true. | [$ a == $ b] sẽ trả về false. |
! = (Không bình đẳng) | So sánh hai số, nếu cả hai khác nhau thì trả về true. | [$ a! = $ b] sẽ trả về true. |
Điều rất quan trọng là phải hiểu rằng tất cả các biểu thức điều kiện phải nằm trong dấu ngoặc vuông với khoảng trắng xung quanh chúng, ví dụ [$ a == $ b] là đúng trong khi [$ a == $ b] là không chính xác.
Tất cả các phép tính số học được thực hiện bằng cách sử dụng số nguyên dài.
Toán tử quan hệ
Bourne Shell hỗ trợ các toán tử quan hệ sau đây dành riêng cho các giá trị số. Các toán tử này không hoạt động đối với các giá trị chuỗi trừ khi giá trị của chúng là số.
Ví dụ: các toán tử sau sẽ hoạt động để kiểm tra mối quan hệ giữa 10 và 20 cũng như giữa “10” và “20” nhưng không nằm trong khoảng “mười” và “hai mươi”.
Giả sử biến a giữ 10 và biến b giữ 20 thì –
Hiển thị các ví dụ
Bourne Shell hỗ trợ các toán tử quan hệ sau đây dành riêng cho các giá trị số. Các toán tử này không hoạt động đối với các giá trị chuỗi trừ khi giá trị của chúng là số.
Giả sử biến a giữ 10 và biến b giữ 20 thì –
Nhà điều hành | Sự mô tả | Thí dụ |
-eq | Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không; nếu có, thì điều kiện trở thành đúng. | [$ a -eq $ b] không đúng. |
– Là | Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không; nếu các giá trị không bằng nhau, thì điều kiện trở thành true. | [$ a -ne $ b] là true. |
-gt | Kiểm tra xem giá trị của toán hạng bên trái có lớn hơn giá trị của toán hạng bên phải hay không; nếu có, thì điều kiện trở thành đúng. | [$ a -gt $ b] không đúng. |
-lt | Kiểm tra xem giá trị của toán hạng bên trái có nhỏ hơn giá trị của toán hạng bên phải hay không; nếu có, thì điều kiện trở thành đúng. | [$ a -lt $ b] là true. |
-ge | Kiểm tra nếu giá trị của toán hạng bên trái lớn hơn hoặc bằng giá trị của toán hạng bên phải; nếu có, thì điều kiện trở thành đúng. | [$ a -ge $ b] không đúng. |
– các | Kiểm tra nếu giá trị của toán hạng bên trái nhỏ hơn hoặc bằng giá trị của toán hạng bên phải; nếu có, thì điều kiện trở thành đúng. | [$ a -le $ b] là true. |
Điều rất quan trọng là phải hiểu rằng tất cả các biểu thức điều kiện phải được đặt bên trong dấu ngoặc vuông với khoảng trống xung quanh chúng. Ví dụ: [$ a <= $ b] đúng trong khi [$ a <= $ b] không chính xác.
Thí dụ
Đây là một ví dụ sử dụng tất cả các toán tử quan hệ
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a is equal to b"
else
echo "$a -eq $b: a is not equal to b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a is not equal to b"
else
echo "$a -ne $b : a is equal to b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a is greater than b"
else
echo "$a -gt $b: a is not greater than b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a is less than b"
else
echo "$a -lt $b: a is not less than b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a is greater or equal to b"
else
echo "$a -ge $b: a is not greater or equal to b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a is less or equal to b"
else
echo "$a -le $b: a is not less or equal to b"
fi
Tập lệnh trên sẽ tạo ra kết quả sau:
10 -eq 20: a is not equal to b
10 -ne 20: a is not equal to b
10 -gt 20: a is not greater than b
10 -lt 20: a is less than b
10 -ge 20: a is not greater or equal to b
10 -le 20: a is less or equal to b
Các điểm sau đây cần được xem xét khi làm việc với các toán tử quan hệ:
- Phải có khoảng trắng giữa các toán tử và các biểu thức. Ví dụ, 2 + 2 là không đúng; nó nên được viết là 2 + 2.
- Câu lệnh if … then … else … fi là một câu lệnh ra quyết định đã được giải thích trong chương tiếp theo.
Toán tử Boolean
Các toán tử Boolean sau đây được Bourne Shell hỗ trợ.
Giả sử biến a giữ 10 và biến b giữ 20 thì –
Nhà điều hành | Sự mô tả | Thí dụ |
! | Đây là sự phủ định hợp lý. Điều này biến một điều kiện đúng thành sai và ngược lại. | [! false] là true. |
-o | Đây là logic HOẶC . Nếu một trong các toán hạng là true, thì điều kiện trở thành true. | [$ a -lt 20 -o $ b -gt 100] là đúng. |
-một | Đây là logic AND . Nếu cả hai toán hạng đều đúng, thì điều kiện trở thành đúng, ngược lại là sai. | [$ a -lt 20 -a $ b -gt 100] là sai. |
Toán tử chuỗi
Các toán tử chuỗi sau được Bourne Shell hỗ trợ.
Giả sử biến a giữ “abc” và biến b giữ “efg” thì –
Nhà điều hành | Sự mô tả | Thí dụ |
= | Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không; nếu có, thì điều kiện trở thành đúng. | [$ a = $ b] không đúng. |
! = | Kiểm tra xem giá trị của hai toán hạng có bằng nhau hay không; nếu các giá trị không bằng nhau thì điều kiện trở thành true. | [$ a! = $ b] là true. |
-z | Kiểm tra xem kích thước toán hạng chuỗi đã cho có bằng 0 hay không; nếu nó có độ dài bằng 0, thì nó trả về true. | [-z $ a] không đúng. |
-N | Kiểm tra xem kích thước toán hạng chuỗi đã cho có khác 0 hay không; nếu nó là độ dài khác không, thì nó trả về true. | [-n $ a] không sai. |
str | Kiểm tra nếu str không phải là chuỗi rỗng; nếu nó trống, thì nó trả về false. | [$ a] không sai. |
Người điều hành kiểm tra tệp
Chúng tôi có một số toán tử có thể được sử dụng để kiểm tra các thuộc tính khác nhau được liên kết với tệp Unix.
Giả sử một tệp biến chứa một tên tệp hiện có “kiểm tra” kích thước của nó là 100 byte và có quyền đọc , ghi và thực thi trên –
Nhà điều hành | Sự mô tả | Thí dụ |
-b tập tin | Kiểm tra xem tệp có phải là tệp đặc biệt của khối không; nếu có, thì điều kiện trở thành đúng. | [-b $ file] là sai. |
-c tệp | Kiểm tra xem tệp có phải là tệp ký tự đặc biệt hay không; nếu có, thì điều kiện trở thành đúng. | [-c $ file] là sai. |
-d tệp | Kiểm tra xem tệp có phải là một thư mục hay không; nếu có, thì điều kiện trở thành đúng. | [-d $ file] không đúng. |
-f tệp | Kiểm tra xem tệp có phải là tệp bình thường hay không so với thư mục hoặc tệp đặc biệt; nếu có, thì điều kiện trở thành đúng. | [-f $ file] là true. |
-g tập tin | Kiểm tra xem tệp có tập hợp bit ID nhóm (SGID) không; nếu có, thì điều kiện trở thành đúng. | [-g $ file] là sai. |
-k tệp | Kiểm tra xem tệp có tập hợp bit dính hay không; nếu có, thì điều kiện trở thành đúng. | [-k $ file] là sai. |
-p tệp | Kiểm tra xem tệp có phải là một đường ống được đặt tên hay không; nếu có, thì điều kiện trở thành đúng. | [-p $ file] là sai. |
-t tệp | Kiểm tra xem bộ mô tả tệp có đang mở và được liên kết với một thiết bị đầu cuối hay không; nếu có, thì điều kiện trở thành đúng. | [-t $ file] là sai. |
-u tập tin | Kiểm tra xem tệp có tập hợp bit Set User ID (SUID) hay không; nếu có, thì điều kiện trở thành đúng. | [-u $ file] là sai. |
-r tệp | Kiểm tra xem tệp có thể đọc được hay không; nếu có, thì điều kiện trở thành đúng. | [-r $ file] là đúng. |
-w tập tin | Kiểm tra xem tệp có thể ghi được không; nếu có, thì điều kiện trở thành đúng. | [-w $ file] là đúng. |
-x tệp | Kiểm tra xem tệp có thực thi được không; nếu có, thì điều kiện trở thành đúng. | [-x $ file] là đúng. |
-s tệp | Kiểm tra xem tệp có kích thước lớn hơn 0 hay không; nếu có, thì điều kiện trở thành đúng. | [-s $ file] là true. |
-Tập tin điện tử | Kiểm tra xem tệp có tồn tại hay không; là đúng ngay cả khi tệp là một thư mục nhưng tồn tại. | [-e $ file] là true. |
C Shell Operator
Liên kết sau sẽ cung cấp cho bạn một ý tưởng ngắn gọn về C Shell Operator –
C Shell Operator
Korn Shell Operator
Liên kết sau giúp bạn hiểu các toán tử Korn Shell –
Korn Shell Operator