Câu 1Cách viết nào là đúng để gán cho một biến shell?
Shell Script - Biến và thay thế lệnh
Gán bằng name=value và tham chiếu bằng "$name", xem nháy đơn và nháy kép mở rộng khác nhau ra sao, chạy thay thế lệnh $(date), tính toán số học $(( n * 2 )), và đọc đầu vào bằng read — minh họa và thực hành trên terminal trong trình duyệt.
Dùng biến — gán và tham chiếu
Trong một shell script, bạn đặt tên cho một giá trị và dùng lại nó bao nhiêu lần tùy thích.
Bạn gán bằng dạng name=value, và không được đặt khoảng trắng quanh dấu =.
Nếu đặt, nó bị hiểu thành một lệnh riêng và báo lỗi.
Bạn lấy lại giá trị đã gán bằng $name hoặc ${name}.
Nếu có ký tự đi liền ngay sau $name, nó được xem là một phần của tên biến, nên hãy dùng ${name} để đánh dấu ranh giới.
name=alice, rồi lấy ra bằng $name để dùng.Dấu nháy — nháy đơn và nháy kép khác nhau khi mở rộng
Có hai loại dấu nháy để bao một chuỗi, và chúng mở rộng khác nhau.
Bên trong nháy đơn '...', $name được xử lý theo nghĩa đen và không được mở rộng.
Bên trong nháy kép "...", $name được thay bằng giá trị của nó.
Dùng nháy kép khi bạn muốn chèn một giá trị vào giữa văn bản, như "Hello $name", và dùng nháy đơn khi bạn muốn in $ nguyên dạng.
$name nguyên dạng; nháy kép thay nó bằng giá trị.name=alice # không có khoảng trắng quanh =
echo "hello $name" # hello alice (nháy kép mở rộng)
echo 'hello $name' # hello $name (nháy đơn thì không)
echo "path is ${name}/data" # dùng {} để đánh dấu ranh giới tên
Thay thế lệnh — $()
$(command) là cách dùng đầu ra của một lệnh làm giá trị ngay tại nơi bạn viết.
Viết kiểu như today=$(date +%Y-%m-%d) thì ngày mà date tạo ra đi thẳng vào today.
Bạn dùng nó để thu kết quả của một lệnh vào một biến hoặc chèn nó vào giữa văn bản.
$(date) được thay bằng đầu ra của việc chạy date, và today=$(date) đặt giá trị đó vào biến.today=$(date +%Y-%m-%d) # thu đầu ra của date vào một biến
echo "today is $today" # chèn giá trị đã thu vào văn bản
user=$(whoami) # đầu ra của lệnh khác cũng làm giá trị được
echo "user: $user"
Tính toán số học — $(( ))
Bên trong $(( )) là tính toán số học với số nguyên.
$(( 3 + 4 )) được thay bằng 7.
Bạn có thể dùng + để cộng, - để trừ, * để nhân, / để chia, và % cho phần dư.
Biến đi vào không cần $, viết trực tiếp theo tên như $(( n * 2 )).
$(( )) được tính: $(( 3 + 4 )) là 7, và với n=5 thì $(( n * 2 )) là 10.echo "sum: $(( 10 + 5 ))" # cộng được 15
n=7
echo "double: $(( n * 2 ))" # biến đi vào không cần $
echo "rest: $(( 17 % 5 ))" # phần dư với % là 2
Nhận đầu vào — read
read v đọc một dòng đầu vào và đặt nó vào biến v.
Bạn dùng nó khi muốn hỏi người dùng một giá trị bên trong một script.
Trong console của khóa học này, truyền đầu vào bằng pipe, như printf 'value\n' | ./greet.sh, chạy ổn định.
In một lời nhắc bằng echo trước read giúp rõ hơn cần gõ gì.
read n đọc một dòng và đặt vào n. Truyền một giá trị qua pipe bằng printf đưa nó tới read mà không cần gõ tay.echo "enter your name:" # nhắc cần gõ gì
read who # đọc một dòng vào who
echo "hi, $who" # chèn giá trị bạn nhận được vào văn bản
printf 'bob\n' | (read who; echo "hi, $who") # đầu vào cũng có thể đến từ pipe
Chèn số đếm vào thông điệp bằng thay thế lệnh
Thay thế lệnh $() thường được dùng để thu một "kết quả đếm", như số lượng tệp, vào một biến.
Viết kiểu như n=$(ls *.txt | wc -l) thì kết quả kết hợp của ls và wc -l đi vào n.
Chèn biến đó vào một chuỗi nháy kép và bạn có thể dựng một thông điệp một dòng dễ đọc bao gồm cả số đếm.
ls và wc -l đi vào n qua thay thế lệnh, và chèn nó vào văn bản hiển thị txt files: 2.Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2echo '$name' hiển thị thế nào (khi name=alice)?
Câu 3Cách nào đặt đầu ra của một lệnh vào một biến như một giá trị?