Nhập môn Bash Scripting
Alex Scriven
Data Scientist
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:
$1, $2, ...$@ và $* trả về tất cả đối số trong ARGV$# cho biết số lượng đố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
“Phạm vi” trong lập trình là mức độ biến có thể truy cập.
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!
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.
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!
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:
echo giá trị cần trả về (dòng cuối của hàm) và bắt bằng lệnh lồng nhauHã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?
$? là 127 (lỗi)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
Nhập môn Bash Scripting