Đối số, giá trị trả về và phạm vi

Nhập môn Bash Scripting

Alex Scriven

Data Scientist

Truyền đối số vào hàm Bash

Truyền đối số vào hàm tương tự như vào script, dùng ký hiệu $1.

Bạn cũng có các thuộc tính ARGV đặc biệt đã học:

  • Mỗi đối số truy cập qua $1, $2, ...
  • $@$* trả về tất cả đối số trong ARGV
  • $# cho biết số lượng đối số
Nhập môn Bash Scripting

Ví dụ truyền đối số

Hãy truyền một vài tên tệp làm đối số vào hàm để minh họa. Ta sẽ lặp qua và in chúng.

function print_filename {
    echo "The first file was $1"

for file in $@ do echo "This file has name $file" done }
print_filename "LOTR.txt" "mod.txt" "A.py"

 

 

 

The first file was LOTR.txt
This file has name LOTR.txt
This file has name mod.txt
This file has name A.py
Nhập môn Bash Scripting

Phạm vi trong lập trình

 

“Phạm vi” trong lập trình là mức độ biến có thể truy cập.

  • “Toàn cục” nghĩa là truy cập được ở mọi nơi trong chương trình, kể cả trong FOR, IF, hàm, v.v.
  • “Cục bộ” nghĩa là chỉ truy cập được trong một phần của chương trình.

Vì sao quan trọng? Nếu truy cập thứ chỉ có phạm vi cục bộ, chương trình có thể lỗi!

Nhập môn Bash Scripting

Phạm vi trong hàm Bash

Khác với đa số ngôn ngữ (ví dụ Python, R), các biến trong Bash mặc định là toàn cục.

function print_filename {
    first_filename=$1
}

print_filename "LOTR.txt" "model.txt" echo $first_filename
LOTR.txt

Lưu ý: phạm vi toàn cục có thể nguy hiểm vì dễ gây tác dụng ngoài ý muốn.

Nhập môn Bash Scripting

Giới hạn phạm vi trong hàm Bash

Bạn có thể dùng từ khóa local để giới hạn phạm vi biến.

function print_filename {
    local first_filename=$1
}

print_filename "LOTR.txt" "model.txt" echo $first_filename


 

Hỏi: Vì sao không báo lỗi mà chỉ là dòng trống?

Trả lời: first_filename được gán từ phần tử ARGV đầu tiên ở phạm vi toàn cục ($1).

Tôi chạy script không có đối số (bash script.sh) nên mặc định là phần tử trống. Hãy cẩn thận!

Nhập môn Bash Scripting

Giá trị trả về

Chúng ta biết cách truyền đối số vào — còn lấy giá trị ra thì sao?

Tùy chọn return trong Bash chỉ dùng để cho biết thành công (0) hay lỗi (giá trị khác 1–255). Giá trị này nằm trong biến toàn cục $?

Các cách có thể dùng:

  1. Gán vào biến toàn cục
  2. echo giá trị cần trả về (dòng cuối của hàm) và bắt bằng lệnh lồng nhau
Nhập môn Bash Scripting

Một lỗi trả về

Hãy xem một lỗi trả về:

function function_2 {
    echlo # Lỗi gõ của 'echo'
}

function_2 # Gọi hàm echo $? # In giá trị trả về
script.sh: line 2: echlo: command not found
127

Điều gì đã xảy ra?

  1. Có lỗi khi gọi hàm
    • Script tìm chương trình 'echlo' nhưng không tồn tại
  2. Giá trị trong $? là 127 (lỗi)
Nhập môn Bash Scripting

Trả về đúng cách

Hãy trả về đúng cách để dùng ở nơi khác trong script bằng echo và bắt lệnh lồng nhau:

function convert_temp {
    echo $(echo "scale=2; ($1 - 32) * 5 / 9" | bc)
}

converted=$(convert_temp 30) echo "30F in Celsius is $converted C"
30F in Celsius is -1.11 C
  • Lưu ý: không còn tạo biến trung gian.
Nhập môn Bash Scripting

Hãy thực hành!

Nhập môn Bash Scripting

Preparing Video For Download...