Khóa học Bash Shell cơ bản cho người mới

Khóa học bash shell cơ bản cho người mới của Lập Trình Không Khó sẽ giúp các bạn nhanh chóng tiếp cận và làm quen với các linux command thông dụng và cách viết bash script. Sau khi học xong tutorial này, bạn sẽ có khả năng tự tìm kiếm các trợ giúp về Bash shell khi cần; Bạn cũng sẽ biệt được có những command nào và dùng nó để làm gì, khi nào cần dùng nó. Và cuối cùng là bạn có thể bắt đầu tự viết các script đơn giản để phục vụ mục đích học tập và công việc của mình. Khóa học Bash Shell này sẽ trình bày 4 phần chính:

  1. Các command thông dụng: liệt kê chức năng và cách sử dụng các command đó. Việc học bash shell không thể thiếu những kiến thức này được. Chúng là nền tảng để bạn có thể làm các công việc đơn giản trên môi trường Bash shell và hỗ trợ bạn trong việc tạo ra các bash script để làm các công việc phức tạp hơn.
  2. Làm quen với Bash script: Phần này sẽ hướng dẫn bạn các kiến thức về ngôn ngữ Bash, học bash script. Cách khai báo biến, làm việc với mảng, chuỗi, cấu trúc điều khiển, vòng lặp và hàm trong ngôn ngữ Bash.
  3. Mẹo khi làm việc với Bash shell: Phần này sẽ chỉ cho bạn một số mẹo hay ho để quá trình học bash shell và làm việc trên Bash shell thuận tiện hơn.
  4. Cách debug Bash script: Hướng dẫn bạn cách để debug (gỡ lỗi) script Bash của chúng ta trong quá trình code và làm việc.Học Bash Shell cơ bản

Khóa học Bash shell cơ bản này được mình dịch lại từ 1 dự án mang tên bash-guide trên Github (tiếng Anh) với gần 10k lượt stars. Bạn có thể xem dự án đó tại đây.

Các command thông dụng

Phần này trong khóa học Bash Shell sẽ cung cấp cho bạn các command thường được sử dụng trong khi làm việc. Việc học Bash script sẽ cần phải biết được các command và khi nào sử dụng nó. Đó là mục đích của phần này.

Nhóm command cơ bản

Nhóm các command cơ bản trong khóa học bash shell này đưa ra các command cơ bản nhất, dùng cho mọi tình huống và bài toán.

a. export

Hiển thị danh sách tất cả các biến môi trường. Nếu bạn muốn xem chi tiết một biến cụ thể, sử dụng echo $VARIABLE_NAME.

Ví dụ:

- Bài viết liên quan dành cho bạn -

b. whatis

whatis hiển thị mô tả các command của người dùng, command hệ thống, các hàm thư viện, và các command khác có trong manual page.

Ví dụ:

c. whereis

whereis giúp bạn tìm kiếm các file thực thi, file nguồn và các manual page sử dụng cơ sở dữ liệu được xây dựng tự động bởi hệ thống.

Ví dụ:

d. which

which giúp bạn tìm kiếm các file thực thi từ các đường dẫn thư mục mà bạn đã đặt trong biến môi trường PATH. Command này sẽ in ra [các] đường dẫn tuyệt đối của file thực thi.

Ví dụ:

e. clear

Xóa nội dung trên cửa sổ làm việc.

Nhóm command thao tác tệp

Phần này của hướng dẫn học bash script sẽ liệt kê các command thường được dùng khi làm việc với tệp tin.

cat chmod chown cp diff file find gunzip gzcat gzip head
lpq lpr lprm ls more mv rm tail touch

a. cat

Nó có thể sử dụng cho một số mục đích sau trong UNIX hoặc Linux:

  • Hiển thị nội dung tệp tin văn bản lên màn hình
  • Copy các tệp tin văn bản
  • Gộp các tệp tin văn bản
  • Tạo các tệp tin văn bản mới

b. chmod

Command chmod là viết gọn của “change mode”. Nó cho phép bạn thay đổi các quyền đọc (read), ghi (write) và thực thi (excute) của các tệp và thư mục. Xem thêm thông tin về command này tại đây.

c. chown

Command chown là viết gọn của “change owner”. Nó cho phép bạn thay đổi owner của một tệp hoặc thư mục, có thể là một userr và một group. Cách sử dụng cơ bản là truyền vào user (owner), tiếp theo là group và phân tách nhau bởi dấu hai chấm.

d. cp

Copy một tệp tin từ vị trí này tới vị trí khác.

Trong đó filename1 là đường dẫn ban đầu của tệp tin gốc và filename2 là đường dẫn đích của tập tin bản sao.

e. diff

So sánh các tệp tin và hiển thị ra các sự khác biệt.

f. file

Xác định loại tệp tin và hiển thị thông tin encoding.

Ví dụ:

g. find

Tìm kiếm các tệp tin trong một thư mục

Ví dụ:

h. gunzip

Giải nén các tệp tin nén bởi gzip.

i. gzcat

Cho phép bạn xem nội dung các tệp tin nén gzip mà không cần phải gunzip chúng.

j. gzip

Dùng để nén các tệp tin.

k. head

Hiển thị n=10 (mặc định) dòng đầu tiên của một tệp tin. Nếu muốn thay đổi n, sử dụng head -n <number> filename.

l. lpq

Kiểm tra hàng đợi máy in.

Ví dụ:

m. lpr

Thực hiện in 1 tệp tin.

n. lprm

Xóa lệnh in đang có trong hàng đợi máy in.

o. ls

Liệt kê các tệp tin và thư mục. ls có rất nhiều tham số: -l để hiển thị dạng danh sách với các thông tin kích thước, chủ sở hữu, ai có quyền thao tác và thời gian thay đổi lần cuối của các tệp tin. -a sẽ hiển thị tất cả các tệp tin (bao gồm các tệp tin bị ẩn). Xem thêm thông tin về command này tại đây.

Ví dụ:

p. more

Hiển thị một phần đầu nội dung của tệp tin (xem thêm bằng phím cách, gõ q để thoát)

q. mv

Di chuyển một tệp tin từ vị trí này tới vị trí khác.

Trong đó filename1 là đường dẫn ban đầu của tệp tin và filename2 là đường dẫn nơi bạn muốn chuyển tệp tin tới.

Và command này cũng dùng để đổi tên tệp tin hoặc thư mục.

r. rm

Xóa một tệp tin. Sử dụng command này với thư mục bạn sẽ gặp báo lỗi.
rm: directory: is a directory
Để xóa một thư mục, bạn cần truyền tham số -r để nó xóa thư mục đó và toàn bộ nội dung bên trong. Bạn có thể bổ sung tham số -f để yêu cầu xóa và bỏ qua xác nhận của hệ thống.

$ rm filename

s. tail

Giống head command, nhưng là hiển thị nội dung ở cuối tệp tin. Sử dụng tham số -n nếu muốn thay đổi số lượng dòng hiển thị.

t. touch

Cập nhật thời gian truy cập và sửa đổi của tệp tin tới thời gian hiện tại. Nếu tệp tin đó không tồn tại, nó sẽ được tạo ra.

Nhóm command thao tác văn bản

Làm việc với văn bản thì không thể không biết đến những command dưới đây mà khóa học bash shell đã tổng hợp lại cho bạn. Chúng sẽ giúp ích bạn rất nhiều trong công việc đấy.

awk cut echo egrep fgrep fmt grep nl sed sort
tr uniq wc

a. awk

awk là một trong những command rất hữu ích để làm việc với các tệp tin văn bản. Nó tác động tới từng dòng nội dung của văn bản. Mặc định awk sẽ dùng khoảng trắng để phân tách các trường. Cú pháp thông dụng nhất của awk

Hãy thử xem xét tệp tin /etc/passwd. Ví dụ tệp tin này có các dòng dữ liệu như sau:

Bây giờ bạn chỉ muốn lấy username có trong tệp tin này. Tham số -F sẽ giúp chúng ta chỉ định việc phân tách các trường dựa vào đâu. Trong trường hợp này đó là dấu :. Và { print $1 } có nghĩa là chúng ta in ra trường đầu tiên.

Sau khi thực thi command trên bạn sẽ có được kết quả như sau:

`Để xem thêm thông tin về awk, hãy tìm đọc cái này.

b. cut

Xóa một phần nội dung ở mỗi dòng của các tệp tin văn bản.

Giả sử dưới đây là nội dung của tệp tin example.txt:

Và thử chỉ hiển thị các cột 2, 7 và 9 ngăn cách nhau bởi dấu cách

Kết quả thực thi command trên là:

c. echo

Hiển thị một dòng văn bản lên màn hình.

Hiển thị “Hello World”

Kết quả thực thi command trên là:

Hiển thị “Hello World” có ký tự xuống hàng (“\n”)

Kết quả thực thi command trên là:

d. egrep

Tìm và xuất ra các dòng khớp với một pattern nào đó – Extended Expression (đại diện cho: grep -E).

Nội dung tệp tin example.txt

Xuất ra các dòng có xuất hiện từ “Lorem” hoặc “dolor” trong example.txt

Kết quả thực thi command trên là:

e. fgrep

Tìm và xuất ra các dòng khớp với một pattern nào đó – FIXED pattern matching (alias for: grep -F).

Nội dung tệp tin example.txt

Tìm dòng chứa chính xác chuỗi ‘(Lorem|dolor)’ trong example.txt

Kết quả thực thi command trên là:

f. fmt

Định dạng lại cách hiển thị văn bản

Ví dụ: example.txt (chỉ có 1 dòng)

Hiển thị dữ liệu của example.txt có chiều rộng 20 ký tự

g. grep

Tìm kiếm văn bản trong các tệp tin. Bạn có thể sử dụng grep để tìm các dòng văn bản khớp với một hoặc nhiều biểu thức chính quy (regular expression). Command này sẽ chỉ xuất ra các dòng khớp với điều kiện của bạn.

Ví dụ:

Bạn cũng có thể yêu cầu grep tìm kiếm bỏ qua yếu tố viết hoa/thường với tham số -i. Sử dụng -r để tìm kiếm cho tất cả các tệp tin trong 1 thư mục, ví dụ:

Và dùng -w để so khớp từ (word boudary). Xem thêm thông tin về grep, hãy đọc link này.

h. nl

Thêm số thứ tự dòng vào đầu các dòng trong tệp văn bản.

example.txt

Hiển thị examlple.txt kèm với số thứ tự dòng

i. sed

Trình chỉnh sửa phục vụ cho việc tạo bộ lọc (filter) và chuyển đổi (tranform) dữ liệu văn bản.

example.txt

Thay thế khoảng trắng bằng gạch nối

Thay thế các chữ số bằng ký tự “d”

j. sort

Sắp xếp các dòng văn bản trong một tệp tin. Sử dụng tham số -r để sắp xếp theo thứ tự đảo ngược.
Ví dụ nội dung file example.txt

Sắp xếp example.txt

Xáo trộn các dòng của example.txt nhưng nhóm các dòng giống nhau lại

k. tr

Thay đổi hoặc xóa các ký tự

example.txt

Chuyển các ký tự thường thành ký tự hoa

Thay thế khoảng trắng bằng dấu xuống dòng (\n)

l. uniq

Xóa trùng lặp dữ liệu trong tệp tin văn bản

example.txt

Hiển thị dữ liệu không còn trùng lặp của example.txt (bạn cần sắp xếp trước, nếu không command uniq sẽ không thấy được sự trùng lặp)

Hiển thị các dòng dữ liệu không có trùng lặp kèm theo số lần các dòng này có trong tệp tin văn bản

m. wc

Cho chúng ta biết tệp tin có bao nhiêu dòng, bao nhiều từ và bao nhiêu ký tự trong đó.

Ví dụ:

Trong đó 7459 là số dòng, 15915 là số từ và 398400 số lượng ký tự.

Nhóm command thao tác thư mục

Dưới đây là các command được dùng để thao tác với thư mục, vị trí làm việc. Đây là những command bạn dùng với tần suất thường xuyên, do đó khóa học bash shell của chúng ta cũng sẽ tìm hiểu chi tiết từng command nhé.

cd mkdir pwd

a. cd

cd là viết tắt của “change directory”. Nó giúp bạn di chuyển vị trí làm việc. Chạy command dưới đây

sẽ di chuyển bạn về thư mục home. Bạn có thể truyền vào đường dẫn tương đối hoặc tuyệt đối nơi bạn muốn di chuyển tới để di chuyển tới nơi đó.

b. mkdir

Tạo một thư mục mới.

Bạn có thể sử dụng để tạo nhiều thư mục cùng lúc tại thư mục bạn đang làm việc.

Bạn cũng có thể sử dụng mkdir để tạo một thư mục có tên project1 bên trong thư mục /samples/bash/projects/ đã có trước đó bằng cách chạy command sau:

Nếu một trong số các thư mục cha không tồn tại, sẽ có báo lỗi.

c. pwd

Cho bạn biết đường dẫn tuyệt đối của thư mục nơi bạn đang làm việc. Viết tắt của print working directory:

Nhóm command SSH, thông tin hệ thống & mạng

Khóa học Bash Shell cũng cung cấp cho bạn kiến thức về các command để kết nối, truyền tải dữ liệu với remote server, các command liên quan đến thông tin hệ điều hành và internet.

bg cal date df dig du fg finger jobs last
man passwd ping ps quota scp ssh top uname uptime
w wget whoami whois

a. bg

Hiển thị danh sách các backgroud job (công việc chạy trong nền).

b. cal

Hiển thị lịch của tháng hiện tại.

c. date

Hiển thị ngày và giờ của thời điểm hiện tại.

d. df

Hiển thị mức dùng ổ đĩa: đã dùng bao nhiêu, còn trống bao nhiêu

e. dig

Kiểm tra thông tin bản ghi DNS của một tên miền.

f. du

Hiển thị mức sử dụng ổ đĩa của các tệp tin hoặc thư mục. Xem thêm thông tin về command tại link này

Các option:

  • -h (Dễ đọc hơn) Hiển thị mức dùng ở đơn vị (KB), (MB) và (GB).
  • -s (Tóm tắt) Hiển thị mức dùng ổ đĩa của thư mục một cách tóm tắt.

Ví dụ:

g. fg

Di chuyển các job lên foreground (chuyển từ chạy trong nền ra chạy trên màn hình console)

h. finger

Displays information about user.
Hiển thị thông tin về một user.

i. jobs

Liệt kê các job đang chạy trong backgroud, cung cấp cho bạn chỉ số job (job number)

j. last

Liệt kê các thông tin đăng nhập cuối cùng của bạn về người dùng được chỉ định.

k. man

Hiển thị tài liệu hướng dẫn (manual page) của command cụ thể.

l. passwd

Cho phép user đang đăng nhập thay đổi mật khẩu đăng nhập.

m. ping

PING tới 1 host nào đó kèm theo kết quả. Được dùng để kiểm tra xem máy của bạn có kết nối tới host đó hay không.

n. ps

Liệt kê các tiến trình hiện có của bạn.

Sử dụng tham số -ef. -e cho tất cả các tiến trình and -f để hiển thị đầy đủ thông tin.

o. quota

Cho biết mức dùng ổ đĩa của bạn là bao nhiêu.

p. scp

Truyền dữ liệu từ máy localhost tới máy remote hoặc ngược lại.

Copy dữ liệu từ localhost tới remote host

copy dữ liệu từ remote host về localhost

Nếu cổng kết nối SSH không phải cổng 22(mặc định), bạn cần sử dụng tới tham số -P.

q. ssh

ssh (SSH client) là một chương trình cho phép bạn đăng nhập và thực thi các command trên 1 máy remote từ máy tính của bạn.

Bạn có thể sử dụng -p để truyền vào cổng kết nối SSH, mặc định là cổng 22.

r. top

Hiển thị các tiến trình đang được kích hoạt.

s. uname

Hiển thị thông tin nhân hệ điều hành.

t. uptime

Hiển thị thời gian hoạt động (uptime).

u. w

Displays who is online.
Hiển thị user nào đang online.

v. wget

Download tệp tin từ internet.

w. whoami

Trả về username của user đang đăng nhập.

x. whois

Xem thông tin whois của một tên miền.

Nhóm command thác tác tiến trình

Việc quản lý các tiến trình cũng là một phần kiến thức quan trọng có trong khóa học Bash Shell này. Bạn hãy cũng mình đi tìm hiểu các command cho việc quản lý tiến trình nhé.

kill killall & nohup

a. kill

Bắt buộc dừng (kết thúc) một tiến trình có PID mà bạn cung cấp.

b. killall

Bắt buộc dừng (kết thúc) tất cả các tiến trình theo tên tiến trình.

c. &

Ký tự & chỉ định cho một command phải chạy ở chế độ backgroud.

d. nohup

nohup là viết tắt của “No Hang Up”. Nó cho phép bạn chạy các command hoặc tiến trình trong backgroud ngay cả khi bạn đăng xuất (logout, không đồng nghĩa với tắt máy) khỏi terminal.

Kết hợp với & để tạo ra các job chạy trong backgroud và vẫn chạy khi đã đăng xuất.

Ngôn ngữ Bash shell cơ bản

Phần này của khóa học bash shell sẽ trình bày ngôn ngữ Bash. Dòng đầu tiên mà bạn sẽ viết trong các file bash script được gọi là shebang. Dòng này trong các file script cho phép các file được thực thi một cách độc lập mà không cần phải gõ sh, bash, python, php,… thêm vào đầu command khi chạy.

Biến trong bash shell

Tạo các biến trong bash cũng tương tự như trong các ngôn ngữ lập trình. Nó không có kiểu dữ liệu. Biến trong bash có thể chưa số, ký tự, chuỗi ký tự, … Bạn cũng không cần phải khai báo biến, chỉ cần gán giá trị cho biến và tham chiếu của nó sẽ được tạo ra.

Ví dụ:

Dòng lệnh trên tạo một biến tên str và gán giá trị “hello world” cho nó. Để lấy giá trị của biến, bạn chỉ cần thêm $ vào trước tên biến:

Ví dụ:

Mảng trong bash shell

Tương tự các ngôn ngữ lập trình, bash cũng có mảng. Một mảng là một tập hợp chứa nhiều giá trị. Không có kích thước giới hạn cho mảng. Mảng trong bash có chỉ số bắt đầu từ 0. Có một vài cách khác nhau để tạo ra biến mảng trong bash:

Ví dụ:

Để hiển thị một giá trị ở chỉ số nhất định, sử dụng cú pháp sau:

Nếu không chỉ định chỉ số mảng, chỉ số 0 sẽ được ngầm định. Để xem có bao nhiêu phần từ trong mảng, sử dụng cú pháp sau:

Bash cũng có toán tử 3 ngôi. Xem một số ví dụ dưới đây:

String trong Bash shell

Xem một số cú pháp dưới đây để biết các thao tác thay thế chuỗi trong bash script:

Hàm trong bash script

Như hầu hết các ngôn ngữ lập trình, bạn có thể sử dụng hàm để nhóm các đoạn code vào thành tức chức năng riêng nhằm mục đích cấu trúc và tái sử dụng. Trong Bash, khai báo một hàm nó như thế này function my_func { my_code }. Còn việc gọi hàm chỉ đơn giản là viết tên hàm ra thôi.

Ví dụ:

Khi bạn chạy command $ hello phía trên nó sẽ xuất ra “world!”. Hai hàm hellosay ở trên là giống nhau, sự khác biệt ở đây chỉ là hàm say có sử dụng đối số đầu tiên mà nó nhận được. Các tham số trong hàm làm việc tương tự như tham số trong các command, tập lệnh.

Cấu trúc điều khiển

Cấu trúc điều khiển trong Bash tương tự như các ngôn ngữ lập trình khác. Có nhiều dạng cấu trúc điều khiển nhưng cơ bản nhất là câu lệnh if điều kiện then khối lệnh và khối lệnh chỉ được thực thi khi điều kiện là đúng (true).

Đôi khi việc sử dụng case statements sẽ làm code bạn rõ ràng hơn so với sử dụng if.

Ví dụ về các biểu thức điều kiện:

Vòng lặp trong bash

Có 3 loại vòng lặp trong Bash: for, whileuntil.
There are three types of loops in bash. for, while and until.

Các cú pháp for khác nhau:

Cú pháp while:

Cú pháp until:

Các mẹo dùng Bash

Việc học bash script không thể bỏ qua các mẹo hay ho giúp chúng ta tăng hiệu quả công việc và tăng tốc độ làm việc.

Tạo alias (viết tắt)

Việc này giúp bạn tiết kiệm thời gian bằng cách gõ alias để chạy một command dài nào đó thường xuyên. Ví dụ:

Chạy nano ~/.bash_profile và thêm dòng dưới đây vào:

Sau khi sửa bạn cần cập nhật lại:

và giờ đây thay vì gõ ssh [email protected] -p2222 thì chỉ cần fox dockerlogin.

Di chuyển nhanh chóng

Chạy nano ~/.bashrc và thêm vào dòng dưới đây:

Bây giờ, bạn cần cập nhật lại bashrc và việc di chuyển tới một đường dẫn dài trở nên rất đơn giản:

Chạy lại command trước đó

Cái này giúp bạn thực thi lại lệnh ngay trước đó. Bạn có thể sử dụng phím mũi tên UP cũng được. Nhưng có thể đôi khi nó vẫn hữu ích.

Để thực thi command ngay trước đó, chạy:

Một lỗi phổ biến ta hay gặp đó là quên sử dụng sudo đối với các command cần quyền super user. Thay vì gõ lại từ đó, hãy sử dụng:

Nó sẽ thêm sudo vào phía trước command vừa chạy, ex: từ mkdir somedir thành sudo mkdir somedir.

Exit traps

Làm cho các tập lệnh bash của bạn hoàn hảo hơn bằng cách thực hiện dọn dẹp một cách đáng tin cậy.

Lưu lại các biến môi trường

Khi bạn thực thi export FOO = BAR, biến của bạn chỉ được lưu trong shell làm việc hiện tại. Để có thể lưu và tiếp tục sử dụng trong tương lai, bạn hãy thêm nó vào tệp ~/.bash_profile như sau:

Truy cập các script của bạn

Bạn có thể dễ dàng sử dụng các script bằng cách tạo một thư mục bin trong thư mục HOME của bạn với mkdir ~/bin. Bây giờ tất cả các script bạn để trong đó có thể sử dụng chỉ bằng cách gọi tên ở bất kỳ nơi đâu.

Nếu trong trường hợp có lỗi, hãy thử thêm code dưới đây vào cuối ~/.bash_profile và chạy source ~/.bash_profile để thử lại xem sao nhé.

Debug trong Bash shell

Bạn có thể dễ dàng debug trong khi học bash shell (bash script) hoặc trong khi làm bằng cách thêm các option vào command. Ví dụ, -n để chỉ kiểm tra cú pháp mà không chạy command đó. -v để in ra command đó trước khi chạy. -x để in ra command đó sau khi chạy xong.

Bản dịch của “Học Bash Shell”

Dưới đây là liên kết tới khóa học bash shell ở các ngôn ngữ khác. Trong đó phiên bản ngôn ngữ tiếng anh là bản gốc. Nếu bạn có khả năng đọc tiếng anh, bạn có thể học bash shell qua link gốc dưới đây nhé.

Liên kết tới bản dịch tiếng Việt: https://github.com/nguyenvanhieuvn/hoc-bash

Như vậy, khóa học bash shell cơ bản đến đây là kết thúc. Sau khi hoàn thành khóa học bash shell này, bạn nên thực hành và sử dụng thường xuyên để nâng cao trình độ cũng như tăng khả năng ghi nhớ các kiến thức được đề cập trong bài viết này. Hẹn gặp các bạn ở các khóa học sau trên LTKK!

Subscribe
Notify of
guest
0 Bình luận
Inline Feedbacks
View all comments