Professional Documents
Culture Documents
1. Basic Operations
1.1. File Operations
1.2. Text Operations
1.3. Directory Operations
1.4. SSH, System Info & Network Operations
1.5. Process Monitoring Operations
2. Basic Shell Programming
2.1. Variables
2.2. Array
2.3. String Substitution
2.4. Functions
2.5. Conditionals
2.6. Loops
3. Tricks
4. Debugging
1. Basic Operations
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 .
$ export
Ví dụ:
$ export
AWS_HOME=/Users/adnanadnan/.aws
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LESS=-R
$ echo $AWS_HOME
/Users/adnanadnan/.aws
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.
$ whatis something
Ví dụ:
$ whatis pwd
pwd (1) - print name of current/working directory
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.
$ whereis name
Ví dụ:
$ whereis python
python: /usr/bin/python3.8 /usr/lib/python2.7 /usr/lib/python3.8 /etc/python3.8 /usr/local/lib/python3.8 /mnt/c/Users/hieunv/AppData/Local/Pr
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.
$ which program_name
Ví dụ:
$ which python3
/usr/bin/python3
e. clear
$ clear
cat chmod chown cp diff file find gunzip gzcat gzip head
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
$ cat filename
$ cat file1 file2
$ cat file1 file2 > newcombinedfile
$ cat < file1 > file2 #copy file1 to file2
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
$ cp filename1 filename2
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
f. file
Xác định loại tệp tin và hiển thị thông tin encoding.
$ file filename
Ví dụ:
$ file index.html
index.html: HTML document, ASCII text
g. find
Ví dụ:
h. gunzip
$ gunzip filename
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.
$ gzcat filename
j. gzip
$ gzip filename
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 .
$ head filename
$ head -n 1 filename
l. lpq
$ lpq
Ví dụ:
$ lpq
Rank Owner Job File(s) Total Size
active adnanad 59 demo 399360 bytes
1st adnanad 60 (stdin) 0 bytes
m. lpr
$ lpr filename
n. lprm
$ lprm job_number
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.
$ ls option
Ví dụ:
$ ls -la
rwxr-xr-x 33 adnan staff 1122 Mar 27 18:44 .
drwxrwxrwx 60 adnan staff 2040 Mar 21 15:06 ..
-rw-r--r--@ 1 adnan staff 14340 Mar 23 15:05 .DS_Store
-rw-r--r-- 1 adnan staff 157 Mar 25 18:08 .bumpversion.cfg
-rw-r--r-- 1 adnan staff 6515 Mar 25 18:08 .config.ini
-rw-r--r-- 1 adnan staff 5805 Mar 27 18:44 .config.override.ini
drwxr-xr-x 17 adnan staff 578 Mar 27 23:36 .git
-rwxr-xr-x 1 adnan staff 2702 Mar 25 18:08 .gitignore
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)
$ more filename
q. mv
$ mv filename1 filename2
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.
$ mv old_name new_name
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ị.
$ tail filename
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.
touch filename
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 là
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:
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
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:
root
daemon
bin
sys
sync
Để 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.
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
c. echo
Hello World
Hello
World
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 ).
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
Xuất ra các dòng có xuất hiện từ "Lorem" hoặc "dolor" trong example.txt
Lorem ipsum
dolor sit amet,
et dolore magna
duo dolores et ea
sanctus est Lorem
ipsum dolor sit
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 ).
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
foo (Lorem|dolor)
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
foo (Lorem|dolor)
f. fmt
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed
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
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
1. Lorem ipsum
2. dolor sit amet,
3. consetetur
4. sadipscing elitr,
5. sed diam nonumy
6. eirmod tempor
7. invidunt ut labore
8. et dolore magna
9. aliquyam erat, sed
10. diam voluptua. At
11. vero eos et
12. accusam et justo
13. duo dolores et ea
14. rebum. Stet clita
15. kasd gubergren,
16. no sea takimata
17. sanctus est Lorem
18. ipsum dolor sit
19. amet.
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
Hello-This-is-a-Test-1-2-3-4
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. example.txt
f
b
c
d
g
a
e
d
$ sort example.txt
a
b
c
d
d
e
f
g
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
b
f
a
c
d
d
g
e
k. tr
example.txt
l. uniq
example.txt
a
a
b
a
b
c
d
c
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)
a
b
c
d
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
3 a
2 b
2 c
1 d
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 đó.
$ wc filename
Ví dụ:
$ wc demo.txt
7459 15915 398400 demo.txt
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
$ cd
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 đó.
$ cd dirname
$ cd ~/.ssh/ # di chuyển tới thư mục .ssh nằm trong thư mục home
$ cd .. # lùi về trước 1 thư mục
b. mkdir
$ mkdir dirname
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:
$ mkdir /samples/bash/projects/project1
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 :
$ pwd
a. bg
Hiển thị danh sách các backgroud job (công việc chạy trong nền).
b. cal
c. date
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.
$ dig domain
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
$ du [option] [filename|directory]
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ụ:
$ du -sh pictures
1.4M pictures
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
$ finger username
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.
$ last yourUsername
k. man
Hiển thị tài liệu hướng dẫn (manual page) của command cụ thể.
$ man command
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.
$ ping 8.8.8.8
n. ps
$ ps -u yourusername
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.
$ ps -ef
o. quota
$ quota -v
p. scp
Truyền dữ liệu từ máy localhost tới máy remote hoặc ngược lại.
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.
$ ssh user@host
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
s. uname
$ uname -a
t. uptime
u. w
v. wget
$ wget file_url
w. whoami
x. whois
$ whois domain
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.
$ kill PID
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.
$ killall process_name
c. &
Ký tự & chỉ định cho một command phải chạy ở chế độ backgroud.
$ command &
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.
$ nohup command
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.
#!/usr/bin/env bash
2.1. Variables
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ụ:
str="hello world"
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ụ:
2.2. Array
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ụ:
array[0]=val
array[1]=val
array[2]=val
array=([2]=val [0]=val [1]=val)
array=(val val val)
Để 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:
${#array[@]}
${varname:-word} # Nếu varname tồn tại và khác null, trả về varname; ngược lại trả về word
${varname:=word} # Nếu varname tồn tại và khác null, trả về varname; ngược lại gán giá trị word cho varname và trả về varname
${varname:+word} # Nếu varname tồn tại và khác null, trả về word; ngược lại trả về null
${varname:offset:length} # substring, trả về substring của varname bắt đầu từ offset và lấy tới length ký tự.
${variable#pattern} # Nếu pattern khớp với phần đầu của variable, xóa phần khớp ngắn nhất trong variable và trả về phần còn lại.
${variable##pattern} # Nếu pattern khớp với phần đầu của variable, xóa phần khớp dài nhất trong variable và trả về phần còn lại.
${variable%pattern} # Nếu pattern khớp với phần cuối của variable, xóa phần khớp ngắn nhất trong variable và trả về phần còn lại.
${variable%%pattern} # Nếu pattern khớp với phần cuối của variable, xóa phần khớp dài nhất trong variable và trả về phần còn lại.
${variable/pattern/string} # Phần khớp dài nhất trong variable sẽ được thay thế bởi string. Chỉ có so khớp đầu tiên bị thay thế.
${variable//pattern/string} # Phần khớp dài nhất trong variable sẽ được thay thế bởi string. Tất cả các so khớp bị thay thế.
${#varname} # Trả về độ dài của chuỗi trong biến varname.
2.4. Functions
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.
function name() {
shell commands
}
Ví dụ:
#!/bin/bash
function hello {
echo world!
}
$ hello
# hay một ví dụ khác có tham sô:
$ function say {
echo $1
}
$ say "hello world!"
Khi bạn chạy command $ hello phía trên nó sẽ xuất ra "world!". Hai hàm hello và say ở 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.
2.5. Conditionals
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).
if [ điều_kiện ]; then
# Thực thi khi điều_kiện là true
else
# Thực thi khi điều_kiện là false
fi
Đô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.
case expression in
pattern1 )
statements ;;
pattern2 )
statements ;;
...
esac
2.6. Loops
Có 3 loại vòng lặp trong Bash: for , while và until . There are three types of loops in bash. for , while and until .
Cú pháp while :
while condition; do
statements
done
Cú pháp until :
until condition; do
statements
done
3. Tricks
Set an alias
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ụ:
$ source ~/.bash_profile
và giờ đây thay vì gõ ssh www-data@adnan.local -p2222 thì chỉ cần fox dockerlogin .
$ export hotellogs="/workspace/hotel-api/storage/logs"
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:
$ source ~/.bashrc
$ cd $hotellogs
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.
$ !!
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:
$ sudo !!
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.
function finish {
# các công việc dọn dẹp ở đây. vd: kill các tiến trình liên quan không cần dùng tới
jobs -p | xargs kill
}
trap finish EXIT
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:
echo export FOO=BAR >> ~/.bash_profile # nhớ dùng hai dấu `>` để ghi append
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é.
4. Debugging
Bạn có thể dễ dàng debug bash script 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.
bash -n scriptname
bash -v scriptname
bash -x scriptname
Contribution
Translation
English | Original
Chinese | 简体中文
Turkish | Türkçe
Japanese | 日本語
License
License CC BY 4.0