Tạo file script
* Soạn thảo file text, đặt tên file shellfile (có đuôi bất kỳ), dòng đầu tiên có dòng sau: #!/bin/sh, sau đó là các lệnh Shell hoặc các lệnh Linux.
* Chạy các lệnh sau để có thể chạy được chmod +x shellfile , sau đó có thể chạy bằng lệnh ./shellfile
Ý nghĩa các ký tự
* Bắt đầu bằng dấu ‘#‘- ký hiệu rằng dòng đấy là comment.
* Dấu ngoặc đơn ‘a’ sẽ in nguyên văn đoạn text trong ngoặc.
* Dấu “a”, sẽ in nguyên văn đoạn text, trong đó biến có thể được thay giá trị.
Các biến
* Biến không cần phải khai báo trước, bắt đầu bằng chữ cái (ví dụ là var), khi tham chiếu thì thêm dấu $ ở trước, ví dụ $var. (gán var=2; thì khi echo $var, sẽ cho kết quả là 2).
* có thể dùng biến và nối với ký tự như sau: ${var}nd thì kết quả trả về 2nd.
Pipes, redirection and backtick
* pipes (|) gửi đầu ra output (stdout) của một tiến trình sang đầu vào (stdin) của mộ tiến trình khác.
1 |
grep "hello" file.txt | wc -l |
* redirection: ghi đầu ra output của mọt chương trình ra một file khác hoặc nối vào file khác
> ghi ra file, nếu nó đã tồn tại thì ghi đè nó
>> Nối vào file cũ nếu đã tồn tại hoặc nếu chưa có thì tạo ra file mới và ghi dữ liệu vào đó.
* Backtick
Đầu ra của một chương trình được sử dụng làm tham số cho chương trình khác (không phải như đầu vào stdin như ở trên) cho một lệnh khác. Bạn cũng có thể dùng đầu ra output như là biến, tham số của chương trình khác.
Lệnh
1 |
find . -mtime -1 -type f -print |
sẽ tìm tất cả các file được thay đổi trong vòng 24 giờ qua (-mtime -2 sẽ là 48). Nếu bạn muốn nén lại thành một file để lưu trữ thì lệnh có thể được sử dụng như:
1 |
tar xvf file.tar infile1 infile2 ... |
Bạn có thể gộp hai lệnh đó và dùng dấu (`), không phảit dấu ngoặc đơn (‘):
1 2 3 |
#!/bin/sh # Sử dụng dấu (`) không phải dấu ('): tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print` |
Lệnh có cấu trúc
* Lệnh “if“: kiểm tra điều kiện đúng :
1 2 3 4 5 6 7 |
if ....; then .... elif ....; then .... else .... fi |
* Lệnh “test” thường được viết như ” [ ] “. Lưu ý là phải có dấu cách sau và trước dấu “[ ]“. Ví dụ:
[ -f “somefile” ] : Test if somefile is a file.
[ -x “/bin/ls” ] : Test if /bin/ls exists and is executable.
[ -n “$var” ] : Test if the variable $var contains something
[ “$a” = “$b” ] : Test if the variables “$a” and “$b” are equal
Gõ lệnh “man test” để có thêm các tham số.
* Gõ tắt bằng các dấu && và ||:
[ -f “/etc/shadow” ] && echo “This computer uses shadow passwors”
Dấu && được sử dụng như điều kiện và. Trong ví dụ trên : “Nếu /etc/shadow tồn tại và (AND) lệnh echo sẽ được thực hiện”. Toán tử OR cũng được sử dụng như ví dụ sau:
1 2 3 4 5 |
#!/bin/sh mailfolder=/var/spool/mail/james [ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; } echo "$mailfolder has mail from:" grep "^From " $mailfolder |
Nếu có thư thì hiện các thư, còn không thì thông báo là không đọc được và kết thúc.
* Lệnh Case: kiểm tra thoả mãn (using shell wildcards such as * and ?).
1 2 3 |
case ... in ...) do something here;; esac |
Ví dụ chúng ta có thể viết một chương trình smartzip có thể giải nén một cách tự động với các dạng:
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/sh ftype=`file "$1"` case "$ftype" in "$1: Zip archive"*) unzip "$1" ;; "$1: gzip compressed"*) gunzip "$1" ;; "$1: bzip2 compressed"*) bunzip2 "$1" ;; *) error "File $1 can not be uncompressed with smartzip";; esac |
Ở đây $1 là tham số (có thể đến $9, $* là tất cả các tham số) ví dụ
smartzip articles.zip.
* Lệnh select được sử dụng để tương tác lựa chọn các phương án khác nhau:
1 2 3 4 |
select var in ... ; do break done .... now $var can be used .... |
Ví dụ:
1 2 3 4 5 6 |
#!/bin/sh echo "What is your favourite OS?" select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do break done echo "You have selected $var" |
Chương trình sẽ in ra màn hình:
1 2 3 4 5 6 7 |
What is your favourite OS? 1) Linux 2) Gnu Hurd 3) Free BSD 4) Other #? 1 You have selected Linux |
* Lệnh while-loop
1 2 3 |
while ...; do .... done |
* Lệnh for-loop
1 2 3 |
for var in ....; do .... done |
Leave a Reply