417
PHN MM MÃ NGUN M

PHẦN MỀM MÃ NGUỒN M - dulieu.tailieuhoctap.vndulieu.tailieuhoctap.vn/books/cong-nghe-thong-tin/the-loai-khac/file... · nhất một dòng về “bản quyền” và trỏ

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

PHẦN MỀM MÃ NGUỒN MỞ

KHÁI NIỆM VỀ MÃ NGUỒN MỞ

Open Source: phần mềm có mã nguồn mở

Free software: phần mềm miễn phí, đôi khi free software đƣợc dùng với ý nghĩa bao gồm cả open-source software và free software

Phần mềm nguồn mở (PMNM) đƣợc cung cấp dƣới cả dạng mã và nguồn, không chỉ là miễn phí về giá mua mà chủ yếu là miễn phí về bản quyền: ngƣời dùng có quyền sửa đổi, cải tiến, phát triển, nâng cấp theo một số nguyên tắc chung qui định trong giấy phép PMNM (ví dụ General Public Licence – GPL)

KHÁI NIỆM VỀ MÃ NGUỒN MỞ

Richard Stallman (MIT) đƣa ra

khái niệm đầu tiên về mã nguồn

mở 1984 (GNU)

Thành lập FSF (Free Software

Fundation, 1985) để quản lý dự

án GNU

Phân biệt : OPEN & FREE

LỢI ÍCH CỦA OPEN SOURCE

Tự do sao chép, chia sẻ

Nhiều bản phân phối, không bị ràng buộc vào nhà cung cấp

Bảo mật tốt

Dễ dàng thay đổi, phát triển theo mục đích

Hỗ trợ cồng đồng cao

BẤT LỢI CỦA OS

Không đảm bảo vì không thu phí

Quá nhiều phiên bản : khó chọn lựa

Nhập nhằng về bản quyền

Ví dụ : Autocad, MatLab vs Octave

http://www.linuxjournal.com/

CƠ HỘI KINH DOANH

Open source đã đƣợc chấp nhận trong các công ty lớn.. Thậm chí Microsoft đã phải lƣu tâm đến Open Source nhƣ đối thủ to lớn.

Các doanh nghiệp vừa và nhỏ cũng sẽ ƣa chuộng phần mềm Open Source hơn.

Open Source đã giành đƣợc khoảng 70% thị trƣờng ứng dụng Web, và dƣờng nhƣ con số này vẫn tiếp tục tăng lên hàng năm.

CÁC LOẠI GIẤY PHÉP

▪Phần mềm thƣơng mại (Commercial Software)

▪Phần mềm thử nghiệm giới hạn (Limited Trial Software)

▪Phần mềm “chia sẻ” (Shareware)

Phần mềm sử dụng phi thƣơng mại (Non-commercial Use)

Phần mềm không phải trả phần trăm cho nhà sản xuất (Royalties Free Binaries Software).

Thƣ viện phần mềm không phải trả phần trăm (Royalties Free Software Libraries).

CÁC LOẠI GIẤY PHÉP

PHẦN MỀM MÃ NGUỒN MỞ KIỂU BSD –

(OPEN SOURCE BSD-STYLE)

Một nhóm nhỏ khép kín (closed team) đã phát triển các PMNM theo giấy phép phân phối Berkely (BSD – Berkely Software Distribution) cho phép sử dụng và phân phối lại các phần mềm này dƣới dạng mã nhị phân và mã nguồn. Tuy ngƣời dùng có quyền sửa đổi mã, nhƣng về nguyên tắc nhóm phát triển không cho phép ngƣời dùng tự do lấy mã nguồn từ kho mã ra sửa (gọi là check-out) và đƣa mã đã sửa vào lại kho mã mà không đƣợc họ kiểm tra trƣớc (gọi là các “check-in”).

PMNM kiểu Apache (Open Source Apache-style) Chấp nhận nguồn mở kiểu BSD nhƣng cho phép những ngƣời ngoài nhóm phát triển xâm nhập vào lõi của mã nền (core codebase), tức là đƣợc phép thực hiện các “check-in”.

CỘNG ĐỒNG MÃ NGUỒN MỞ GNU

Cộng đồng GNU ( “Gnu is Not Unix”) đã xây dựng nhiều ứng dụng trên Unix (Linux) : Word proccessing ,Office, Game, Multimedia, networking và các compiler , interpriter , programming languages…

GNU – Phi lợi nhuận song cần tuân thủ một số quy định về bản quyền của GNU - GPL (General Public License) – “copyleft”( thay cho “copyright”)

GNU cung cấp bộ biên dịch C/C++bao gồm :

gcc trình biên dịch C

g++ trình biên dịch C++

gdb Debug

GNU make Trình quản lý mã nguồn và trợ giúp biên dịch

bash shell

Các ngôn ngữ PHP&MySQL , Python , Perl … thuộc loại mã nguồn mở

GIẤY PHÉP CÔNG CỘNG GNU (GPL)

Giấy phép công cộng GNU Phiên bản 2, tháng 6/1991

Copyright (C) 1989, 1991 Free Software Foundation,

Inc. 59 Temple Place - Suite 330, Boston, MA 02111-

1307, USA

Mọi ngƣời đều đƣợc phép sao chép và lƣu hành bản sao

nguyên bản nhƣng không đƣợc phép thay đổi nội dung

của giấy phép này.

BẢN QUYỀN

Các chƣơng trình tuân theo GNU Copyleft hoặc GPL (General

Public License) có bản quyền nhƣ sau [1] :

Tác giả vẫn là sở hữu của chương trình của mình.

Ai cũng được quyền bán copy của chương trình với giá bất kỳ

mà không phải trả cho tác giả ban đầu.

Người sở hữu chương trình tạo điều kiện cho người khác sao

chép chương trình nguồn để phát triển tiếp chương trình

CÁC ĐIỀU KIỆN VÀ ĐIỀU KHOẢN.

Áp dụng những điều khoản trên nhƣ thế nào đối với chƣơng trình

của bạn

Nếu bạn xây dựng một chƣơng trình mới, và muốn cung cấp một cách tối đa cho công chúng sử dụng, bạn cần phát triển chƣơng trình đó thành phần mềm tự do để ai cũng có thể cung cấp lại và thay đổi theo những điều khoản nhƣ trên.

Để làm đƣợc việc này, hãy đính kèm những thông báo nhƣ sau cùng với chƣơng trình của mình. An toàn nhất là đính kèm chúng trong phần đầu của tập tin mã nguồn để thông báo một cách hiệu quả nhất về việc không có bảo hành; và mỗi tệp tin đều phải có ít nhất một dòng về “bản quyền” và trỏ đến toàn bộ thông báo.

Một dòng đề tên chương trình và nội dung của nó.

Bản quyền (C) năm, tên tác giả.

Chƣơng trình này là phần mềm tự do, bạn có thể cung cấp lại và/hoặc chỉnh sửa nó theo những điều khoản của Giấy phép Công cộng của GNU do Tổ chức Phần mềm Tự do công bố; phiên bản 2 của Giấy phép, hoặc bất kỳ một phiên bản sau đó (tuỳ sự lựa chọn của bạn).

Chƣơng trình này đƣợc cung cấp với hy vọng nó sẽ hữu ích, tuy nhiên KHÔNG CÓ BẤT KỲ MỘT BẢO HÀNH NÀO; thậm chí kể cả bảo hành về KHẢ NĂNG THƢƠNG MẠI hoặc TÍNH THÍCH HỢP CHO MỘT MỤC ĐÍCH CỤ THỂ. Xin xem Giấy phép Công cộng của GNU để biết thêm chi tiết.

CÁC ĐIỀU KIỆN VÀ ĐIỀU KHOẢN.

NHẬP MÔN LINUX

Email : [email protected]

Nội dung

Lịch sử phát triển Linux

Hệ thống Linux

Cài đặt Linux

Quản lý Linux

Toàn cảnh hệ điều hành

Operating Systems

Windows

personal

95; 98; Me

Unix standard Unix Free Windows

professional Macintosh

NT; 2000; XP;

Vista; 7; 8

BSD; System V;

Solaris

Free BSD;

Linux

System 1-7;

Mac OS (Unix

kernel)

OS usage – 09/2012

Tại sao sử dụng unix

1. Linux – HĐH ổn định và mạnh : Đƣợc kiểm tra bởi số lƣợng lớn ngƣời dùng

2. Linux đƣợc trang bị một số lƣợng lớn phần mềm : không chỉ riêng về phía lập trình viên mà còn dành cho ngƣời sử dụng

3. Linux thƣờng xuyên đƣợc cập nhật để chống lại lổ hổng và virus

4. Linux – miễn phí và có thể cài đặt trên nhiều hệ thống phần cứng khác nhau

5. Sử dụng Linux : đóng góp và chia sẻ lẫn nhau

Một vài khuyết điểm

Khó tìm driver

Hỗ trợ cộng đồng – Không đảm bảo 100%

Không phải là 1 hệ thống Linux duy nhất

Windows vs linux

1. Windows dễ dàng cài đặt :

2. Windows là miễn phí :

3. Windows thƣờng xuyên nhiễm virus :

4. Windows đƣợc dùng tại các công ty, nên chúng ta phải học nó :

5. Linux chỉ dùng để lập trình trên Console :

6. Linux không hỗ trợ các chƣơng trình của Windows :

7. Linux nhanh hơn Windows :

Đúng và Sai Sai

Đúng Đúng và Sai

Đúng và Sai

Đúng và Sai Đúng và Sai

Lịch sử phát triển unix

1. 1962 : Time-sharing (CTSS) đƣợc phát triển tại MIT và rất thành công

2. 1965 : MIT + Bell Labs + General Electric : MULTICS (MULTiplexed Information & Computing Services) mục đích thƣơng mại nhƣng không thành công

3. 1969 : Ken Thompson và Dennis Ritchie viết 1 phiên bản nhân (kernel ) đầu tiên cho 1 HĐH trong phòng thí nghiệm BELL, và đặt tên là UNIX (lấy cảm hứng từ MULTCICS)

4. Năm 1970 : Dennis Ritchie tạo ra ngôn ngữ C, và đã viết lại UNIX bằng C.

Lịch sử phát triển unix

1. 1974 : xuất bản The Unix Timesharing System,

Comm. Ritchie & Thompson nhận giải thƣởng

ACM Turing Award năm 1984

2. 1980 : BSD – Berkerly Systems Distribution

3. 1987 : Minix – Unix đƣợc dùng trong giáo dục

4. 25/08/1991 : Linus Torvalds cho ra đời Linux

version 0.01

5. 01/1992, Linus cho ra version 0.12 với shell

và C compiler

Lịch sử phát triển unix

Sở hữu unix

Các hãng sở hữu UNIX bản quyền Các hãng sở hữu UNIX miễn phí

OPEN GROUP sở hữu :

• Tên gọi UNIX ®

• Chuẩn Single UNIX Specification

Đặc điểm chính của HĐH Linux

1. Nhiều tiến trình (process)

2. Truy cập nhiều ngƣời dùng

3. Swap bộ nhớ lên đĩa

4. Nạp module thực hiện khi cần

5. Cùng sử dụng chƣơng trình

6. Thƣ viện chung

Đặc điểm chính của HĐH Linux

1. Bộ đệm động của đĩa

2. System VIPC

3. Hỗ trợ các định dạng hệ thống tập tin khác nhau

4. Khả năng hỗ trợ mạng

5. Khả năng chạy chương trình của HĐH khác

6. Làm việc trên các phần cứng khác nhau

CÁC PHIÊN BẢN LINUX

Nhiều phiên bản Linux hiện đang tồn tại

Số hiệu phiên bản theo định dạng : X.YY.ZZ

• Nếu YY là số chẵn : phiên bản ổn định.

• Nếu YY là số lẻ : phiên bản thử nghiệm .

• Chú ý phân biệt số phiên bản của hệ điều hành

(Linux kernel) với phiên bản của các phân phối (ví

dụ RedHat 9.0 với kernel Linux 2.4.5-15).

Bản phân phối linux (LINUX DISTRIBUTION)

CÀI ĐẶT LINUX

[email protected]

Cài đặt HĐH LINUX - Fedora

Software : Fedora 17 DVD

http://fedoraproject.org/en/get-fedora

Yêu cầu phần cứng :

o CPU : 400 MHz processor

o Ít nhất : 1 GB RAM

o Ổ cứng : 10 GB trống

1. Sửa cấu hình máy để boot từ ổ CDROM

2. Đặt đĩa số 1 vào ổ CDROM và khởi động lại máy

3. Lựa chọn một phương pháp cài đặt, ví dụ text

4. Chọn kiểu cài đặt , server hay máy trạm hay custom

5. Chia lại ổ đĩa cứng (Patitions)

6. Lựa chọn các gói sẽ cài đặt (RPM)

7. Linux tự làm việc

8. Cấu hình lại nếu có yêu cầu hiển thị trên màn hình.

Tiến trình cài đặt bình thường như cài đặt

HĐH Windows

Màn hình đăng nhập FEDORA

CÀI ĐẶT FEDORA TRÊN MÁY ẢO

Máy chính cài bộ cài đặt VMWare Workstation

Trên HĐH đang sử dụng : XP, 7

Máy ảo : Cài đặt thông qua File DVD Fedora ISO

VMWare Player : Chƣơng trình chạy (Play)máy ảo

Yêu cầu lớp ở lớp thực hành :

Cài đặt Fedora 17 trên máy ảo bằng file .ISO

Đặt username theo dạng : tên.”chữ cái đầu họ và chữ

lót”.MSSV

CÀI ĐẶT FEDORA TRÊN MÁY ẢO

Ví dụ : Trần Văn An. MSSV : 0910203040

Username đặt là : antv0910203040

Lƣu cài đặt máy ảo và chép vào USB (khuyến cáo

8GB trở lên)

CÀI ĐẶT NHIỀU HỆ ĐIỀU HÀNH CÙNG

LINUX

Mục đích : tận dụng thế mạnh của nhiều HĐH khác

nhau để lập trình, giải trí.

Song Song : Linux + Win XP/Win 7

Chú ý : Backup dữ liệu trƣớc khi cài đặt

Partition và phân chia partition

23

1. Để dễ quản lý HDD , ta chia nó ra thành nhiều vùng khác nhau.

Mỗi vùng nhƣ thế ta gọi là một partition.

2. Số lƣợng partition đƣợc giới hạn trên một ổ cứng

- Có tối đa là 4 primary partition

3. Có duy nhất một active partition Để chia nhiều hơn bốn partition,

ta cần tạo một extended partition (cái này là primary), và

trong extended partition này, ta sẽ tạo các partition gọi là

logical partition. Số lƣợng logical partition là không giới

hạn . Nhƣng bạn nên nhớ rằng logical partition không

thể là một active partition đƣợc.

Khái niệm Partition và phân chia Partition

25

Phân chia partition

Dùng “partition magic” để phân chia HDD thành nhiều

partitions khác nhau và theo sơ đồ nhƣ sau để cài chung Linux,

Windows trên đó:

Partition label , Kiểu Size Status log/pri hda :

hda1 Windows FAT32 > 4GB active primary .

hda2 /boot ext3 >= 100MB primary .

hda3 extended xxx primary .

hda4 Setup FAT32 xxx logical .

hda5 / (root) ext3 > 3GB logical .

hda6 swap sizeof RAM hoặc 2 * sizeof(RAM)

PHÂN VÙNG ĐĨA CỨNG

Mỗi HĐH sẽ cài đặt trên 1 (hoặc nhiều) phân vùng riêng biệt.

Boot Sector : Mảng dữ liệu chứa thông tin về partition, thƣờng ở sector đầu tiên của partition

MBR(Master Boot Record) : Khi khởi động từ đĩa cứng BIOS cũng tìm đến sector đầu tiên của đĩa cứng

26

Khái niệm Bootloader

27

1. Với Microsoft Windows 9x trở về trƣớc, khái niệm bootloader

chỉ là đặt 3 tập tin command.com, msdos.sys, io.sys

vào bootsector của ổ C:\ - partition đầu tiên trên HDD, rồi

khi boot thì nạp chúng.

2. Cải tiến thêm một chút so với Win9x, WinNT, Win2K(XP),

Win7 có trình bootloader riêng. Hệ thống này bao gồm 3

files: ntldr , NTDETECT.COM , boot.ini

3. Thông tin về hệ điều hành sẽ đặt trong boot.ini và

bootloader sẽ đọc nội dung file này để detect (dò tìm) hệ

điều hành và load chúng.Do đó bạn có thể cài chung

WinNT(XP) và Win9x trên một HDD.

Khái niệm Bootloader

28

Với Linux thì khác: có 2 bootloader phổ biến là LILO (Linux Loader) và GRUB (Grand Unified Bootloader). Cấu hình và chƣơng trình đƣợc đặt trong /boot trên parttion của HDD . Ngoài ra còn có một bản link từ /etc/LILO.conf hay /etc/GRUB.conf lƣu thông tin về hệ điều hành trên máy .

LILO và GRUB đều có thể load windows OS hay nói chính xác hơn là chuyển quyền load boot program cho boot sector nằm trên một partition nào đó. Vì vậy, với NT bootloader hay LILO hoặc GRUB, ta có thể cài chung Linux và Windows trên cùng một HDD.

Đối với Linux, không có khái niệm các ổ đĩa khác nhau. Toàn bộ

các thƣ mục và tập tin đƣợc “gắn” lên (mount) và tạo thành một hệ

thống tập tin thống nhất, bắt đầu từ gốc „/‟

/-----+ !-------/bin

!-------/sbin

!-------/usr------/usr/bin

! !------/usr/sbin

! !------/usr/local

! !------/usr/doc

!

!-------/etc

!-------/lib

!-------/var-------/var/adm

!-------/var/log

!-------/var/spool

!-------/mnt “Mount point” Nơi gắn các thiết bị

!

Các thƣ mục chính trong Linux

• / thư mục gốc root

• /bin /usr/bin/usr/local/bin : thƣ mục chứa chƣơng trình

• /boot : chứa nhân vmlinuz (phiên bản kernel ví dụ : vmlinuz-2.2.20) và các file khởi động

• /dev : thƣ mục chứa các file đặc biệt dùng để giao tiếp các thiết bị ( HDD, sound card, VGA…)

• /etc : file cài đặt cấu hình của hệ thống và các script

• /etc/rc.d scripts khởi động hệ thống

• /etc/X11 scripts cài đặt máy chủ X

• /etc/init.d script kiểm tra máy chủ

• /etc/cron.d mô tả các việc theo thời gian thực hiện

• /etc/skel file sao chép trong thƣ mục cá nhân của user mới

• /home thƣ mục cá nhân của user

Các thư mục chính trong Linux

/lib thƣ viện và module của nhân Linux

/mnt thƣ mục mount các thiết (cd, disk, nfs ..) (dƣới Debian tồn tại thƣ mục /cdrom et /floppy, dƣới thƣ mục gốc).

/opt thƣ mục cài đặt các ứng (nhƣ starOffice, java ..)

/root thƣ mục cá nhân của super-user root

/sbin các file thực thi bởi admin hệ thống

/tmp lƣu trữ các file tạm

/usr chứa các chƣơng trình đƣợc truy cập bởi tất cá các user

/var biến dữ liệu liên quan đến máy (dữ liệu in ấn, theo dõi truy cập http, smb .. trong /var/log)

/proc chứa đựng "image" của hệ thống (/proc/kcore là « ảnh » của RAM) Thực hành : cat /proc/cpuinfo,

cat /proc/net/arp,

cat /proc/interrupts

QUẢN LÝ LINUX

[email protected]

33

Nhân (kernel) đƣợc xem nhƣ là trái tim của hệ điều hành. Nó đƣợc nạp vào RAM lúc khởi động và duy trì hệ thống đến khi tắt máy.

Hầu hết Linux kernel đƣợc xây dựng nhƣ một tập hợp của các module

Các module cần thiết có thể đƣợc biên dịch vào hạt nhân trong lúc xây dựng nó.

Kernel Linux

34

Linux là hạt nhân động, nó có thể “nạp” hay “giải phóng” các module trong lúc vận hành mà không cần phải khởi động lại hệ thống.

Dựa vào những đặt điểm trên ta có thể nói: Linux có thể vận hành đƣợc rất nhiều thiết bị một cách dễ dàng.

VD: Để vận hành đƣợc thiết bị mới nhà phát triển chỉ cần “port” module liên quan đến thiết bị để kernel nhận dạng thiết bị mới.

Kernel Linux

35

• Phiên bản Linux Kernel đầu tiên là 0.01

• Linux Torvalds công bố lần đầu tiên trên Internet

ngày 17/09/1991

• Mã nguồn Linux kernel đƣợc phân phối tự do và

miễn phí (www.kernel.org)

• Hiện tại phiên bản mới nhất của Linux Kernel là

3.6.2

Kernel Linux

Các thành phần chính của Kernel Linux

36

Linux kernel bao gồm 5 subsytems chính:

Quản lý các tiến trình (The Process Manager)

Quản lý bộ nhớ (The Memory Manager)

Hệ thống tập tin ảo (VFS)

Giao tiếp mạng (Network Interface)

Inter-Process Communication Interface.

Để vận hành đƣợc các phần trên , chƣơng trình ngƣời dùng cần

phải ra các lời gọi hệ thống “System call”.

37

Đáp ứng các nhu cầu cấp thấp (về phần cứng) cho

chƣơng trình

Cung cấp môi trƣờng vận hành cho các tiến trình

(process) và luồng (thread).

Kernel Linux

MỘT SỐ LỆNH CƠ BẢN

TERMINAL LINUX

[email protected]

Giao diện ngƣời dùng

Giao diện ngƣời dùng IHM cho phép user giao tiếp

với máy

Shell là một phần của HĐH cho phép ngƣời dùng

giao tiêp với máy

Có 2 loại IHM

GUI ( Graphical user interface)

CLI (Command line interface)

Làm quen với Terminal

Từ Systems. Chọn Terminal

Root và Su

41

• Ngƣời dùng cao cấp nhất (root user) ở GNU/Linux là superuser.

Trong quá trình cài đặt Fedore không dùng quyền root mà giao

quyền quản trị hệ thống cho ngƣời dùng bằng cách dùng lệnh su .

•Tài khoản ngƣời dùng đầu tiên, trong quá trình cài đặt Ubuntu, sẽ

đƣợc gắn quyền su.

•Ngƣời cài đặt hệ thống Fedora sẽ có khả năng tạo ra tài khoản

ngƣời dùng mới, cũng nhƣ giao quyền sudo thông qua ứng dụng

quản lý ngƣời dùng và nhóm ngƣời dùng Users and Groups

•Khi cần thực hiện một chƣơng trình với quyền root, sudo sẽ hỏi

password và sẽ kiểm tra user đƣợc giao quyền chạy chƣơng trình

sudo hay không.

•Đăng nhập vào root : $su --login

42

Dùng trình sudo trong terminal :

- $su <câu lệnh định thực hiện>.

Ví dụ : $ su root

- Nhấn phím “Enter”,

- sudo sẽ hỏi password của user.

Sudo sẽ nhớ lại password của user trong một thời gian nhất

định. Chức năng này cho phép user có quyền sudo đỡ phải nhập

password của mình nhiều lần khi phải thực hiện một loạt câu

lệnh quản trị hệ thống một cách liên tiếp.

Lưu ý. : Mỗi lần thực hiện các công việc quản trị hệ thống,

có nguy cơ phá hỏng hệ thống nếu làm sai !

Root và Sudo

Một số lệnh cơ bản - Các phím tắt

• CTrL+C Kết thúc chay CT

• CTrL+q

• CTrL+x

• Up/Down Di chuyên về lệnh trước /sau đó

• TAB : gõ tắt tên tập tin, thư mục

Các lệnh thao tác trên hệ thống tập tin

Kí tự Chức năng

*?[ ] Kí tự đại diện hay theo mẫu

& Chạy ứng dụng ở chế độ nền (background)

; Dấu phân cách nhiều lệnh trên một dòng lệnh.

> Định hướng dữ liệu xuất ra file.

< Định hướng dữ liệu nhập từ file.

>> Định hướng dữ liệu xuất ra cuối file nếu file đã tồn tại.

| Định hướng dữ liệu xuất là dữ liệu nhập cho lệnh tiếp theo.

$ Sử dụng biến môi trường.

Ký tự đại diện : *,? , []

Ký tự * cho phép thay thế một chuỗi bằng *

Ký tự đại diện : *,? , []

Ký tự « ?» cho phép thay thế để tìm kiếm

Ký tự đại diện : *,? , []

Ký tự « [] » dùng để thay thế tập hợp ký tự riêng lẻ, có thể

sử dụng dấu - để liệt kê một khoảng ký tự liền nhau

Một số lệnh cơ bản

Lệnh uname : cho phép xem phiên bản hệ thống

$ ls: Hiển thị tên tập tin và thƣ mục con trong một

thƣ mục.

Một số Tùy chọn:

-a: hiển thị tất cả kể cả tập tin ẩn

-F: puts a / after directories, an * after executables,

and an @ after links

-l: hiển thị thông tin đầy đủ

-R: hiển thị nội dung của thƣ mục con

-s: hiển thị kích thƣớc tập tin

Một số lệnh cơ bản

Một số lệnh cơ bản

Lệnh man : tra cứu ý nghĩa lệnh

Lệnh halt : tắt hệ thống

Lệnh shutdown : tắt HT

Một số lệnh cơ bản

Lệnh cal : hiển thị lịch

Lệnh date : hiển thị ngày

Lệnh who : hiển thị danh sách các user

Lệnh echo : hiển thị 1 tin nhắn. 1 biến

Một số lệnh cơ bản

cp : copy 1 file hay thƣ mục

mv : move hay rename 1 file

rm : xóa 1 file

unlink: xóa 1 file

mkdir : tạo 1 thƣ mục

rmdir : xóa 1 thƣ mục

pwd : hiển thị thƣ mục đang làm việc của user

top : cho biết thông tin chi tiết chƣơng trình đang chạy

uptime : cho biết thời gian load hệ thống

Một số lệnh cơ bản

cd : Thay đổi thƣ mục làm việc

$cd .

$cd ..

Một số lệnh cơ bản – Xem file

1. cat : xem nội dung file.

2. Ví dụ : $cat tailieu1.txt vanban.doc >tonghop.doc

3. more : hiển thị thêm thông tin.

4. less : hiển thị file 1 cách tƣơng tác.

5. ps : Xem tất cả cá tiến trình đang hoạt động

6. kill : hủy bỏ tiến trình với ID tƣơng ứng

7. clear : xóa màn hình

8. passwd : thay đổi password (nhập password cũ và

password mới)

Một số lệnh cơ bản

1. du : Dung lƣợng xấp xỉ thƣ mục

2. wc : Số dòng, số ký tự của 1 file

3. less foo.txt : hiển thị nội dung file foo.txt ra màn hình Terminal

4. cp foo.txt bar.txt : copy file foo.txt ra bar.txt

5. mv foo.txt hoge.txt : đổi tên file foo.txt thành hoge.txt

6. mv bin sbin : đổi tên folder bin thành sbin

7. rm text.txt : xoá file text.txt

8. rm -r bin : xoá thƣ mục bin

9. rm -rf * : Xoá tất cả mọi thứ ở thƣ mục hiện hành mà không cần xác nhận lại. ( Cẩn thận lệnh này)

10. ln -s foo.txt bar.txt : tạo bar.txt links đến text.txt

11. touch : tạo tập tin

Một số lệnh cơ bản

Quan sát tiến trình GUI : Main menu|system

tools|system monitor

$ps -ax | more Các process đang thực thi

$pstree process in a tree format

Ví dụ : Sao chép tập tin : ~/]$cp <nguồn> <đích>

57

Xóa tập tin : /]$rm <tập tin>

Tạo tập tin : /]$touch <“tên tập tin”>

58

Xem nội dung tập tin : cat , less

59

Lệnh more dùng với “|” để xâu chuỗi

60

Main menu|Home

Một số lưu ý : “/” Root directory

−$pwd Thư mục làm việc

−$locate sapa.sxw Tìm file .

Hoặc Main menu | Seach for file

Các options của lệnh ls có thể tham khảo bằng lệnh

$man ls

Sử dụng file system bằng GUI

Duyệt tìm tập tin

~]$find -name filename –print

~]$locate <filename>

Update database bằng lệnh $sudo updatedb

Trước khi locate

62

Duyệt tìm tập tin

Sử dụng lệnh locate tìm kiếm đơn giản, thực

thi nhanh . Ví dụ tìm các file có tên bắt đầu

bằng chuỗi “test” và kết thúc bởi 1 số từ 0-9

#locate test[0-9]

• Sử dụng lệnh locate tìm kiếm đơn giản, thực thi nhanh . Ví dụ tìm các

file có tên bắt đầu bằng chuỗi “test” và kết thúc bởi 1 số từ 0-9

64

• Sử dụng lệnh find : #find –name <tên file>

Dùng lệnh grep để tìm một chuỗi trong tập tin

$sudo updatedb

$grep –L “string” <tên file>

65

Tìm đƣờng dẫn đến thƣ mục hiện hành

#echo $path

Lệnh tìm location của chương trình :

#which ifconfig

#locate ipconfig

Kích thƣớc tập tin

Xem kích thƣớc tập tin bằng lệnh ls -l

Xem kích thƣớc thƣ mục bằng lệnh du -sh

67

Tên tập tin

• Tên tập tin có thể có khoảng trống (space)

• Sử dụng tên tập tin có khoảng trống trong dòng lệnh:

– Đƣa tên tập tin vào ngoặc:

$ mkdir “a b c”

– Sử dụng ký tự \:

$ cd a\ b\ c

– Sử dụng phím TAB

Xóa thƣ nục không rỗng (not empty)

68

Một số lệnh nén tập tin trong Terminal

1. Nén tập tin chuẩn gzip: #gzip tên_tập_tin

2. Nén 'thƣ mục' vào 'tên.tar.gz„: #tar cvfz tên.tar.gz tên_TM

3. Giải nén 'tập_tin.gz„ : #gunzip tập_tin.gz

4. Nén tập tin 1, 2 vào tên.tar: # tar cvf tên.tar tập_tin_1

tập_tin_2

5. Giải nén các tập tin có trong tập tin 'tên.tar : #tar xvf tên.tar

6. Giải nén các tập tin có trong tập tin 'archive.tar.gz„ : # tar jxvf

tên.tar.bz2

7. Nén 'tập tin' với chuẩn bzip : #bzip2 tên_tập_tin

8. Giải nén 'tên_tập_tin.bz2„ : #bunzip2 tên_tập_tin.bz2

69

QUẢN LÝ TÀI KHOẢN

NGƢỜI DÙNG VÀ NHÓM

[email protected]

71

Nội dung

Khái niệm quản trị ngƣời dùng

Fedora User Manager

Cơ chế lƣu trữ thông tin tài khoản ngƣời dùng

Các lệnh quản lý ngƣời dùng

Một số mô hình phân quyền

72

Linux – HĐH đa ngƣời dùng

1. Linux giống UNIX là HĐH đa ngƣời dùng

2. Khái niệm đa ngƣời dùng là khái niệm quan

trọng trong các HĐH hiện đại nhƣ

WinNT/2000/XP/2003, MAC OS…

3. Khái niệm đa ngƣời dùng trở nên hết sức

quan trọng khi hiện nay hầu nhƣ tất cả máy

tính đều nối mạng (LAN, Internet…)

73

Chức năng quản lý tài khoản người dùng

Linux sử dụng nhiều tài khoản ngƣời dùng để đảm bảo:

1. Chỉ cho phép những ngƣời có quyền đƣợc sử dụng

hệ thống

2. Quyền truy cập các tài nguyên (tập tin, thiết bị…)

đƣợc phân bố hợp lý

3. Mỗi ngƣời dùng có một thƣ mục riêng để lƣu trữ dữ

liệu

4. Tự động thực thi các chƣơng trình riêng biệt cho

từng ngƣời dùng

74

Phân loại người dùng

Có hai nhóm ngƣời dùng :

Ngƣời dùng bình thƣờng (normal user)

Ngƣời quản trị hệ thống (superuser hay administrator)

Mục đích :

An toàn và bảo mật hệ thống

Trình độ kỹ thuật của ngƣời dùng

Ngƣời quản trị hệ thống của Linux là root (cao nhất)

Không sử dụng tài khoản root để làm việc khi không cần thiết !!!

75

Công việc của ngƣời quản trị

Bảo trì, nâng cấp hệ thống

Cài đặt phần mềm, các thiết bị dùng chung

Sao lƣu dữ liệu

Quản lý ngƣời dùng

Các thông tin về ngƣời dùng

Tên tài khoản (Account Name): dùng để đăng nhập vào hệ thống, phải là duy

nhất

Tên đầy đủ (Username): tên đầy đủ của ngƣời dùng, có thể trùng nhau

Mật khẩu (Password): phải dài ít nhất 6 ký tự

Giao diện dòng lệnh mặc định (Login Shell): danh sách đƣợc lấy từ tập tin

/etc/shells, có thể đƣợc gõ vào

Quản lý tài khoản

Quản lý tài khoản

Mỗi ngƣời sử dụng trên hệ thống đƣợc mô tả qua các thông tin sau:

1. username : tên ngƣời sử dụng

2. password : mật khẩu (nếu có)

3. uid : số nhận dạng (user identify number )

4. gid : số của nhóm (group identify number )

5. comment : chú thích

6. Thƣ mục chủ của tài khoản (home directory )

7. Shell đăng nhập (chƣơng trình chạy lúc bắt đầu phiên làm việc)

Các thông tin trên đƣợc chứa trong tập tin /etc/passwd

Quản lý tài khoản : Nhóm ngƣời dùng

Một nhóm ngƣời sử dụng đƣợc mô tả bằng các

thông tin sau:

groupname : tên của nhóm

gid : số của nhóm (gid: group identify number)

danh sách các tài khoản thuộc nhóm

Các thông tin trên đƣợc chứa trong tập tin

/etc/group

78

Quản lý ngƣời dùng bằng giao diện dòng lệnh

1. Xem định danh : lệnh id

]#id <account_name>

2. Chuyển đổi tài khoản : lệnh su

~]#su <account_name>

3. Thêm tài khoản : lệnh useradd

~]#useradd <account_name>

4. Thay đổi mật khẩu : lệnh passwd

~]#paswd <account_name>

5. Thay đổi thông tin ngƣời dùng : lệnh chfn

~#chfn <user_name> <account_name>

6. Thay đổi giao diện dòng lệnh : lệnh chsh

~#chsh <account_name>

7. Thay đổi tài khoản : lệnh usermod

8. Hủy tài khoản : lệnh userdel

~]#userdel <account_name>

Quản lý tài khoản : Nhóm ngƣời dùng

Tạo user :

Cú pháp: #useradd [option] <username>

-c “Thông tin ngƣời dùng”

-d <Thƣ mục cá nhân>

-m : Tạo thƣ mục cá nhân nếu chƣa tồn tại

-g <nhóm của ngƣời dùng>

$useradd –c “Nguyen Van An – Server Admin” –g

serveradd nguyenvan

Quản lý tài khoản : Nhóm ngƣời dùng

Tạo nhóm : $groupadd <groupname>

Xóa nhóm : $groupdel <groupname>

Xem thông tin về Group và user

$id <option> <username>

$groups <username>

Quản lý tài khoản : Nhóm ngƣời dùng

Thay đổi thông tin cá nhân: Cú pháp: #usermod [option] <username>

Những option tƣơng tự Useradd

Ví dụ: #usermod –g kinhdoanh quocvan //chuyển quocvan từ nhóm server admin sang nhóm kinh doanh.

Xóa ngƣời dùng Cúpháp : #userdel [option] <username>

Vídụ : #userdel –r quocvan

Khóa/Mở khóa ngƣời dùng passwd –l <username> / passwd –u <username>

usermod –L <username> / usermod –U <username>

Trong /etc/shadow có thể khóa tài khoản bằng cách thay từ khóa x bằng từ khóa *.

Quản lý nhóm – Xem user

Xem tất cả các user trong hệ thống

$cat /etc/passwd | grep /home

Thay đổi mật khẩu

[vinh1@(none) vinhth]$ passwd

Nếu là root user, ta có thể thay đổi mật khẩu

mọi user acount dƣới quyền

84

Quản lý thành viên bằng gpasswd

Với username là tên của thành viên và groupname là tên nhóm .

Một số cờ dùng để quản lý thành viên trong nhóm :

#gpasswd [flag] username groupname

-a thêm một user vào nhóm

-d Xóa một user ra khỏi nhóm

-A –M Chuyển một user vào nhóm và xóa toàn bộ các user cũ đã có

trong nhóm.

Dùng các công cụ soạn thảo (ví dụ $vi/etc/group)

mở file /etc/group . Xoá các user cần thiết và lƣu

lại file đã sửa. Thoát ra khỏi EDITER kiểm tra lại.

85

Sử dụng gpasswd để quản lý nhóm

Các trường chỉ thông tin của tập tin (dùng ls)

-rw-r--r-- 1 fido users 163 Dec 7 14:31

myfile

• Cột đầu chỉ ra quyền truy cập tập tin

• Cột 2 chỉ số liên kết (link) đối với tập tin hay thư mục

• Cột 3, 4 chỉ chủ sở hữu và nhóm sở hữu

• Cột 5 chỉ độ dài của tập tin

• Cột 6 chỉ thời gian thay đổi cuối cùng

• Cột 7 chỉ tập tin hay thư mục

Các thông tin về nhóm

87

Quản lý tài khoản bằng GUI

Đòi hỏi quyền root để thực thi

Là chƣơng trình quản lý ngƣời dùng bằng giao diện đồ họa

Cách chạy chƣơng trình: chọn mục System Settings | Users and Groups trong menu Application

Một số tác vụ thƣờng gặp:

thêm / xóa / sửa một ngƣời dùng

thêm / xóa / thay đổi thành viên một nhóm

Quản lý tài khoản bằng GUI

90

Thông tin lưu trữ tài khoản trong Linux

Thông tin về tài khoản ngƣời dùng trong Linux đƣợc lƣu trữ

dƣới dạng tập tin văn bản (text file) trong thƣ mục /etc

1. Thông tin ngƣời dùng : /etc/passwd

2. Mật khẩu ngƣời dùng: /etc/shadow

3. Thông tin nhóm: /etc/group

91

Tập tin /etc/passwd

Là cơ sở dữ liệu các tài khoản ngƣời dùng trên Linux dƣới dạng

tập tin văn bản

Mỗi tài khoản ngƣời dùng chiếm một dòng, các trƣờng ngăn

cách nhau bởi dấu “:”

Tập tin /etc/passwd

Tên tài khoản

Nơi giữ chỗ cho mật khẩu (ký tự x)

Mã tài khoản

Mã nhóm chính

Mô tả tài khoản

Thƣ mục riêng

Giao diện dòng lệnh

93

Tập tin /etc/shadow

Là nơi lƣu trữ mật khẩu đã đƣợc mã hóa

Mục tiêu: không lƣu mật khẩu ở tập tin /etc/passwd để tránh

bị bẻ khóa, tăng cƣờng độ bảo mật của hệ thống

Sau khi đã mã hóa thì mật khẩu KHÔNG BAO GIỜ ĐƯỢC

GIẢI MÃ NỮA !

Để kiểm tra mật khẩu thì hệ thống sẽ mã hóa chuỗi ký tự nhập

vào và so sánh với mật khẩu đã mã hóa (Dùng hàm băm)

94

Cấu trúc tập tin /etc/shadow

Tên tài khoản

Mật khẩu đã mã hóa:

− Bắt đầu bằng * tài khoản đã bị vô hiệu hóa (disable)

− Bắt đầu bằng !! tài khoản tạm thời bị khóa (locked)

Ngày đổi mật khẩu (tính từ 1/1/1970)

Ngày có thể đổi mật khẩu (0 = bất kỳ lúc nào)

Ngày phải đổi mật khẩu

Ngày báo mật khẩu sắp hết hạn

Số ngày sẽ vô hiệu hóa tài khoản nếu không đổi mật khẩu đúng

hạn

Ngày sẽ tự động vô hiệu hóa tài khoản

Dự trữ để sử dụng sau

95

Cấu trúc tập tin /etc/shadow

96

Tập tin /etc/group

Lƣu thông tin về các nhóm Tên nhóm

Nơi giữ chỗ cho mật khẩu nhóm (ký tự x)

Mã nhóm

Danh sách các thành viên của nhóm (phân cách nhau bằng dấu phẩy)

QUẢN LÝ TẬP TIN

[email protected]

Quản lý tập tin - hệ thống tập tin

Chức năng của hệ thống tập tin:

Tổ chức dữ liệu ngƣời dùng và dữ liệu hệ thống

Đảm bảo khả năng bảo mật của hệ thống

Trình quản lý hệ thống tập tin trên Linux

Các thiết bị phần cứng cũng đƣợc quản lý nhƣ tập tin (thƣ mục

/dev)

Các tiến trình cũng đƣợc quản lý bởi hệ thống tập tin (thƣ mục /proc)

Linux hỗ trợ nhiều hệ thống tập tin khác nhau

98

99

Các kiểu tập tin:

1. <-> Tập tin bình thƣờng (file)

2. <d> Thƣ mục (directory)

3. <b> Thiết bị khối (block device)

4. <c> Thiết bị ký tự (character device)

5. <l> Liên kết (link)

6. <p> Ống (FIFO)

7. <s> Khe kết nối (socket)

Kiểu tập tin không phân biệt bằng phần mở rộng của tên tập tin

Quản lý tập tin – kiểu tập tin

Quản lý tập tin – kiểu tập tin

Xem kiểu tập tin bằng lện ls -l:

$ls -l abc

-rw-r--r-- 1 root root 0 Jan 19 19:09

abc

Tập tin bình thƣờng : ký tự -

Thƣ mục : ký tự d

Thiết bị khối : ký tự b

Thiết bị ký tự : ký tự c

Liên kết : ký tự l

Ống : ký tự p

Khe kết nối : ký tự s

100

101

Mô hình phân quyền trên tập tin

1. Không ai đƣợc đọc tập tin của tôi

2. Tất cả đều có thể đọc tập tin của tôi

3. Một số ngƣời có thể đọc tập tin của tôi

4. Một số ngƣời có thể ghi tập tin của tôi

5. Tất cả đều có thể đọc, có vài ngƣời có thể ghi tập tin của

tôi

6. Một số ngƣời có thể đọc, có vài ngƣời có thể ghi tập tin

của tôi

102

Mô hình phân quyền trên tập tin

103

Mô hình phân quyền trên tập tin

104

Mô hình phân quyền trên tập tin

105

Mô hình phân quyền trên tập tin

106

Mô hình phân quyền trên tập tin

107

Chú ý với tài khoản root

Có thể xóa các tập tin khi gõ lệnh sai

Có thể làm hỏng hệ thống khi cài đặt phần mềm:

Có thể có phần mềm ác ý, cố tình ghi đè tập tin

/etc/passwd khi cài đặt

Lƣu ý : KHÔNG DÙNG ROOT ĐỂ LÀM VIỆC, khi cần thì

sử dụng lệnh su.

Các quyền truy xuất trên tập tin

Khi tập tin đƣợc tạo lập, các thông tin sau đây đồng thời đƣợc ghi lại:

uid của ngƣời tạo tập tin

gid của ngƣời tạo tập tin

Các quyền thâm nhập tập tin khác . . .

Tập tin đƣợc bảo vệ bởi một tập hợp các bit định nghĩa quyền thâm nhập

r w x r w x r w x

suid sgid

owner group other

Quyền trên tập tin đƣợc chia thành 3 nhóm: cho ngƣời sở hữu, cho nhóm kết hợp và cho những ngƣời khác

Quản lý tập tin

r : Quyền đọc nội dung tập tin, thƣ mục

w : Quyền tạo và xoá nội dung tập tin, tạo và xóa tập tin trong thƣ mục

x : Quyền thực thi tập tin. Quyền truy xuất qua lại trên thƣ mục.

- : Không có quyền

Các quyền với thƣ mục chỉ có hiều lực ở một mức nhất định, thƣ mục con có thể đƣợc bảo vệ trong khi thƣ mục cha thì không.

Lệnh $ ls -lF liệt kê danh sách các tập tin và các thuộc tính của chúng trong một danh mục, qua đó ta có thể xem các thông tin nhƣ loại tập tin, quyền truy nhập, ngƣời sở hữu và kích thƣớc của tập tin. . .

Quản lý tập tin

Mỗi tập tin có một ngƣời sở hữu (owner)

Mỗi tập tin kết hợp với một nhóm (group)

Mỗi nhóm bao gồm nhiều ngƣời dùng (user)

Tập tin đƣợc phân quyền theo ngƣời dùng và nhóm kết hợp

Thay đổi ngƣời sở hữu: lệnh chown

Thay đổi nhóm kết hợp: lệnh chgrp

111

Quản lý tập tin

Quyền theo mã nhị phân 112

• 0 or - - - : No permissions at all

• 4 or r- - : read-only

• 2 or -w-: write-only (rare)

• 1 or - -x: execute

• 6 or rw-: read and write

• 5 or r-x: read and execute

• 3 or -wx: write and execute (rare)

• 7 or rwx: read, write, and execute

113

Một tập tin với quyền 751 có nghĩa là

• Người sở hữu có quyền read, write, và execute bằng 4+2+1=7

• Nhóm có quyền read và execute bằng 4+1=5

• Các đối tượng còn lại có quyền execute bằng 1.

Ví dụ

Thay đổi quyền dùng lệnh chmod 114

• Thay đổi quyền truy cập mới cho myfile .

~#ls -l myfile

~#chmod 345 myfile

~#ls -l myfile

Lưu ý : 345 tương đương quyền -wx r-- x-r

Thay đổi quyền tƣơng đối 115

• Cấp quyền cho ai

<a> tất cả user ,

<g> Nhóm sở hữu ,

<o> user ngoài nhóm sở hữu ,

<u> chỉ cho một user thôi

▫ Các thao tác : cấp mới , thêm , xóa quyền

< + > thêm quyền , < - > bớt quyền , < = > thiết lập quyền

▫ Quyền gì : read, write, execute

< x > thực thi ,

< r > đọc ,

< w > ghi ,

< s > lập bít SUID hay SGID

Thay đổi quyền tƣơng đối

Cú pháp :

$ chmod {a,u,g,o}{+,-,=}{r,w,x} <filename>

Trong đó :

u (user), g (group), o (other), a (all)

Các toán tử :

+ thêm quyền.

- bớt quyền.

= gán giá trị khác

Ví dụ sử dụng thay quyền tƣơng đối

117

Quyền đặc biệt

Một số chƣơng trình do ngƣời dùng thực thi phải có quyền cao hơn mới hoàn thành đƣợc tác vụ.

Ví dụ lệnh passwd phải đƣợc quyền ghi vào tập tin /etc/shadow (nơi chỉ root mới có quyền truy cập)

Quyền đặc biệt (setuid) cho phép chƣơng trình khi chạy có quyền root

Quyền đặc biệt đƣợc ký hiệu bằng ký tự s

118

Thay đổi ngƣời hoặc nhóm sở hữu tập tin

Lệnh chown cho phép thay đổi ngƣời sở hữu, nhóm

sở hữu trên tập tin.

$chown [tùy-chọn]... [chủ][.nhóm] <tập-tin ...>

Thay đổi ngƣời hoặc nhóm sở hữu tập tin

Lệnh chgrp cho phép thay đổi nhóm sở hữu trên tập

tin.

$chgrp [tùy-chọn]... {nhóm|--reference=nhómR}

<tập-tin...>

Umask

Thay đổi quyền mặc định cho một tập tin: dùng lệnh umask (user file-creation mode )mask hay

user-mask

Base Permission là giá trị đƣợc thiết lập sẵn cho user bình thƣờng : + đối với file thông thƣờng giá trị BS là 666 (rw-rw-rw-) + đối với thƣ mục (file đặc biệt) giá trị BS là 777 (rwxrwxrwx)

BS

Umask

Giá trị Mask sẽ “che đi” một số bit trong Base

Permission để tạo ra quyền truy cập chính thức cho

file

Umask

Liên kết

1. Liên kết tƣơng tự nhƣ shortcut trong windows

2. Mục đích: Dễ dàng thay thế, nâng cấp các chƣơng trình, thƣ viện, tập tin… mà không ảnh hƣởng đến toàn bộ hệ thống

3. Có 2 loại liên kết: liên kết cứng và liên kết mềm

4. Linux định danh một tập tin bằng một số nguyên là inode

5. inode là duy nhất trong một phân vùng đĩa

6. Liên kết cứng có cùng inode với tập tin gốc, là tập tin gốc với tên khác

7. Liên kết mềm có inode khác với tập tin gốc, là tập tin chứa liên kết tới tập tin gốc

8. Sử dụng lệnh ln[-s] để tạo liên kết cứng/mềm

124

Dùng lệnh ln để tạo liên kết

$ln [option] <sourrce file> <destanation file>

Bài tập : Tìm hiểu thêm về lệnh $ln

125

Thuộc tính thời gian

Mỗi tập tin có 3 thuộc tính thời gian:

mtime: thời điểm tập tin bị thay đổi nội dung lần cuối

atime: thời điểm tập tin đƣợc truy xuất lần cuối

ctime: thời điểm thuộc tính tập tin bị thay đổi lần cuối

Xem các thuộc tính này bằng lệnh:

$ ls -l –time = atime abc

Cập nhật các thuộc tính này bằng lệnh:

$ touch -m abc

$ touch -a abc

126

QUẢN LÝ PHẦN CỨNG

Quản lý phần cứng – CD ROM 128

Dùng GUI :

Main Menusystem toolsDisk

management CDROM

Ejecting a CDROM

$eject Gỡ CDROM ra khỏi ổ

$eject –t Dừng CD

Dùng terminal : Kích phải CDROM

eject

Mount /unmount cdrom dùng file /etc/fstab

Thêm vào file /etc/fstab dòng lệnh sau:

/dev/cdrom /mnt/cdrom iso9660 defaults,n

oauto,user,ro 0 0

Mounting a device:

#mkdir /mnt/cdrom

#cd /mnt/cdrom

#mount -t iso9660 -o ro /dev/cdrom

/mnt/cdrom

Quản lý phần cứng 130

Lưu ý : Chỉ có Root mới được quyền quản lý Hardware

Về root : #

$su - Nhập password … root]#

#ls /pro Hoặc :

Main menu | system tools | Hardware Browser|

Nhập password của root Hardware Browser

Quản lý phần cứng – Hệ thống 131

System monitor : Main menu system tools

system monitor

#df –h File system

#fdisk –l Kiểm tra các patitions

Quản lý phần cứng - Disk

GUI : Disk Management

CLI : $ fdisk –l

Lƣu ý : Root user mới có quyền truy cập $su -

Quản lý phần cứng - Disk

Bất kỳ ổ đĩa nào muốn truy cập đƣợc từ hệ thống tập tin đều

phải ở trạng thái đƣợc gắn (mounted) vào hệ thống tại “mount point”

Ổ đĩa có thể đƣợc gắn tự động khi khởi động (sử dụng tập tin

cấu hình /etc/fstab), hay gắn thủ công bằng lệnh mount

Một ổ đĩa có thể có nhiều phân vùng, mỗi phân vùng có thể

chứa một hệ thống tập tin khác nhau

133

Quản lý ổ đĩa và phân vùng

Một số ổ đĩa quan trọng trong Linux:

▫ Ổ CDROM: /dev/cdrom

▫ Ổ đĩa mềm: /dev/fd0 ,dev/fd1 …

▫ Ổ đĩa cứng IDE:

Ký hiệu :/dev/hda ,/dev/hdb …

Các phân vùng: /dev/hda1 ,/dev/hda2 …

▫ Ổ đĩa cứng SCSI:

Ký hiệu : /dev/sda ,/dev/sdb …

Các phân vùng: /dev/sda1 ,/dev/sda2 …

134

Quản lý phần cứng - Disk

Các hệ thống tập tin đƣợc Linux hỗ trợ:

FAT, FAT32

NTFS

EXT, EXT2, EXT3 (mặc định của LINUX)

CDROM

Linux cho phép làm việc với nhiều loại hệ thống tập tin thông

qua cơ chế hệ thống tập tin ảo (Virtual File System – VFS)

135

Danh sách các hệ thống tập tin đƣợc hỗ trợ nằm trong tập tin /proc/filesystems

136

Quản lý phần cứng - Disk

Các lệnh thao tác trên phân vùng đĩa cứng: fdisk, parted,

cfdisk, sfdisk, disk druid

Chú ý: Các thao tác trên phân vùng đĩa sẽ hủy toàn bộ dữ liệu !!!

Các bƣớc để thêm một ổ đĩa cứng mới:

Phát hiện ổ đĩa mới

Phân vùng ổ đĩa mới

Định dạng các phân vùng

Gắn các phân vùng vào hệ thống tập tin

137

138

Ví dụ sử dụng lệnh fdisk

Bảo trì hệ thống tập tin

Mục tiêu:

Ngăn chặn sự mất mát dữ liệu, bảo đảm cho hệ thống vận hành chính xác và hiệu quả

Một số biện pháp:

Tắt máy đúng cách

Tạo đĩa khởi động dự phòng

Thƣờng xuyên sao lƣu dữ liệu quan trọng

Kiểm tra và sửa lỗi hệ thống tập tin: sử dụng lệnh fsck

Lập kế hoạch bảo trì hệ thống tập tin: sử dụng lệnh tune2fs

139

Thông tin về thiết bị mạng 140

Thông tin về thiết bị mạng trong thƣ mục /sbin

#/sbin/ifconfig

#cat /etc/modules.conf Show configfile cuûa eth0

141

Các PCI devices trên hệ thống

…]#/sbin/lspci

Cổng USB

…]#/sbin/lsUSB

Thông tin về thiết bị mạng

142

#/sbin/ifconfig –a Các devices + status

Thông tin về thiết bị mạng

143

#/sbin/route Kiểm tra router nối vào mạng

Thông tin về thiết bị mạng

Thông tin về thiết bị ngoại vi

Lƣu ý : Phải có quyền root ( $su - )

#cat /etc/sysconfig/keyboard (mouse)

Hoặc : Main menu system setting Keyboard

(Mouse,Display,sound card . . .)

Configuring the Desktop on GNOME

Trên Desktop Control Center (Control Panel) :

Mail menu | Preferences | Control Center

About myself

Thông tin cá nhân trong tệp /etc/passwd

Accessibility

CD properties config CDROM , mount CDROM

(magicdev).

Back ground

Control Center Preferences

File management

File type and program

Fonts

Mouse and keyboard

Menu and toolbars

Keyboard shortcuts ...

Cấu hình lại hệ thống kết nối internet : Modem, xDSL Eithernet Card :

Main menu|system tools|Internet|

configuration Wizard

Lưu ý : Chỉ root mới được thay đổi cấu hình $ su –

Chọn type of connection | forward tiếp tục theo

chỉ dẫn

2.10.2. Cấu hình mạng (Network Configuration Tool)

Main menu | System setting | Network

•Kết nối Analog Modem

Network configuration | New | Modem

connection |Forward Nhập các thông tin cần thiết

Kết nối INTERNET

Kết nối IDSL,DSL

Chọn xDSL Nhập các thông số trong configure DSL connection |Forward Apply

Kết nối LAN

Chọn Ethernet Connection | Select Eithernet device Configure Network setting | Phương

thức cung câp IP Address (Chọn Dialup khi dùng

PPP)

Nếu không dùng cấp IP ADD tự động nhập các địa chỉ IP,

Subnetmask,Defauld Gateway Address

Kết nối INTERNET

Chọn DNS Thiết lập Doman Name Server

IDSN and Token ring

Wireless card and VPN

CÁC ỨNG DỤNG TRÊN MẠNG

• Web browser : Kích biểu tương Mozilla trên Panel hoặc

$mozilla .

• Cài đặt Mozilla Proxies :

Edit |Preferences |Advances | Proxies

• News client and E-mail : Kích biểu tượng Ximian trên panel

Tools setting Thêm ,xoá ,thay đổi Mail Account và

các thông số khác

NÂNG CẤP VÀ CÀI ĐẶT

PACKAGES TRONG LINUX

151

Nâng cấp và cài đặt phần mềm dùng RPM

1. GÓI RPM VÀ CÁC TÍNH CHẤT CỦA GÓI

2. RPM VÀ CÁC CÔNG CỤ QUẢN LÝ GÓI (RPM Tools)

3. RPM console commands

4. RPM and security

5. MỘT SỐ VÍ DỤ

1. Là các gói được cài trong HĐH mã nguồn mở LINUX do ReadHat đề

xuất. Các gói này có thể được cài đặt , gỡ bỏ hoặc nâng cấp. Các gói RPM có đuôi là .rpm

2. Lợi ích khi sử dụng tiện ích RPM

i. Đơn giản,dễ sử dụng nhờ giao diện GUI hoặc từ dòng lệnh

ii. Dễ nâng cấp , quản lý , bảo trì

iii. Dễ truy vấn , tư vấn từ các nguồn khác nhau

iv. Dễ dàng gỡ bỏ gói (Uninstall Packet) Refresh hệ thống

v. Dễ dàng kiểm tra , giám sát hệ thống.

vi. Tính bảo mật Kiểm tra tính toàn vẹn của dữ liệu.(Hash value)

RPM : RedHat Packet Manager

1. Desktop : X window System GNOME,KDE

2. Applications:Editors, Office/ Productivity ,Sound/Video.. .

3. Server:Server Config Tools,WEB server, Mail Server,

DNS, FTP Server …….. .

4. Development : Development tools,….. .

5. System: Administration tools,system tools,Printing Support

Packet Management Tools Functions

Các gói trên đƣợc chia thành hai loại :

• Các gói chuẩn – standard

• Các gói phụ -Extra

Cấu trúc của gói RPM

Quản lý gói bằng GUI :

1.Main Menu | System setting | Add/remove

Application Add ,Remove,Install Package

1.Ƣu điểm :

• Cho phép cải tạo mạng FPT,HTML …

• Thông tin đầy đủ về gói

• Kiểm tra gói : Tính toàn vẹn,MD sum …

2.Cú pháp

#rpm [tùy chọn] <packet name> ( Lƣu ý “#”)

• Dùng lệnh man rpm để tìm hiểu hiểu cách dùng lệnh rpm

quản lý gói RPM.

• Định vị gói RPM

$su –

#cd /mnt/cdrom/Fedora/RPMS

Quản lý gói từ dòng lệnh CLI

Các options được sử dụng với rpm :

-p <file-name> Thông tin về các gói trong <file-

name>

-i Thông tin về các gói như tên , phiên bản, size, ngày

đóng gói …

-a Thông tin về các gói được cài trong hệ thống

-f Truy vấn gói sở hữu một file nào đó

-l<Tên gói> Liệt kê các file trong một gói

-c Liệt kê các file cấu hình trong một gói

Quản lý gói từ dòng lệnh CLI

Truy vấn (query) packages từ dòng lệnh (CLI) dùng tùy chọn <q>

#.../RPMS]#rpm –q [options] <packet-name>

Các tùy chọn : -q <tên gói> : Cung cấp tên , phiên bản, số phát hành

-qa : Liệt kê tất cả các gói đã cài đặt

-qf <tập tin> : Truy vấn gói liên kết với tập tin

-qp <tên gói> : truy vấn gói

-qi <tên gói> : Cung cấp các thông tin về gói

-ql <tên gói> : Liệt kê các tập tin liên kết với gói

Quản lý gói từ dòng lệnh CLI

160

Cài đặt gói RPM dùng tùy chọn <i>

#rpm –i [option]<packet-name>

Ví dụ :

#rpm –i quota 1.55-4.i386.rpm

a. Các bƣớc thực thi lệnh

Kiểm tra tính phụ thuộc

Kiểm tra khả năng xung đột

Xử lý các tập tin cấu hình

Cài đặt tập tin

Xử lý sau cài đặt

Cập nhât dữ liệu

Quản lý gói từ dòng lệnh CLI

161

Một số tùy chọn khi cài đặt một gói

v :Cung cấp thông tin đầy dủ của gói

h :Hiển thị trạng thái đang cài đặt nhờ dấu #

-percent : Hiện thị lƣợng công việc đã thực hiện (%)

-test cài đặt thử và báo lỗi

-replacefiles : Thay thế gói cũ bằng một gói mới

-force : Cài đặt không quan tâm đến lỗi tranh chấp

Ví dụ :

#rpm –ivh nano-1.2.1-4.i386.rpm mutt-1.4.1-

3.i386.rpm

Quản lý gói từ dòng lệnh CLI

Quản lý gói từ dòng lệnh CLI

Quản lý gói từ dòng lệnh CLI

Trường hợp gói đã được cài đặt sẵn:

#rpm –ivh bad-1.0-1.i386.rpm

bad package bad-1.0.1-1.i368 is already installed

Thay thế một gói đã có sẵn

#rpm –ivh replacepkgs bad-1.0-1.i386.rpm

Kiểm tra một gói dùng tùy chọn < V >

#rpm –Vp <package-name>

#rpm –V <package-name>

#rpm –Vf <path>

Quản lý gói từ dòng lệnh CLI

Tranh chấp : Khi hai gói có các file trùng tên nhau song nội dung có

thể khác nhau

• Ví dụ :

#rpm –ivh –1.0-1.i386.rpm

Bad/bin/badfile conflicts with file from good –1.0-1

#rpm –ivh replacefiles <package>

• Lƣu ý : Tốt hơn nên chọn gói nào cần thiết , xóa các gói không

cần

Quản lý gói từ dòng lệnh CLI

Gỡ bỏ gói <e>

#rpm –e [Tùy chọn] <package-name>

Nâng cấp <U>

#rpm –Uvh <package-name> Gỡ bỏ version cũ cài version

mới

Freshening package

#rpm –Fvh <package-name>

#rpm –Fvh *.rpm

Quản lý gói từ dòng lệnh CLI

Cài đặt các gói dạng phi Linux 167

File dạng TAR được tạo ra bởi lệnh TAR trên CLI. Đây là file

Nén (Archive) không phải dạng chuẩn cho Linux

Các gói binary dưới dạng TAR:

1. Tải file chkwww-0.4.3.tar.gz từ địa chỉ

www.sourseforge.net vào /usr/local

2. Sử dụng gzip để giải nén

#gzip –dv pychkwww_0.4.TAR.gz

pychkwww_0.4.tar.gz: 81.6% --replaced with

pychkww_0.4.TAR

Các options :

-d decompresses the file

-v In tiến trình lên màn hình

-f Ghi đè file mới lên file cũ

Giải nén gói .TAR

#tar –xvf <tên tập tin.TAR>

Các options:

-x This option extracts the files

-v Hiển thị tiến trình “unTAR”

-f Ghi đè lên file cũ

Kiểm tra thư mục mới được tạo bởi “unTAR”

#ls –al pychkww

Giải nén gói .TAR

Yum : Install, Update, Uninstall

Nâng cấp hệ thống #yum update (cần quyền su)

Tìm kiếm các gói trong database #yum search any-package

Tra cứu thông tin về gói # yum info any-package

Cài đặt 1 gói : #yum install any-package

Ví dụ : $ yum install gkrellm

Gỡ bỏ cài đặt : #yum remove any-package

Danh sách các gói : # available yum list|less

Xem các gói đã cài đặt #yum list installed|less

Danh sách các gói đã cập nhật #yum list updates|less

Yum : Install, Update, Uninstall

Dọn dẹp hệ thống

Ví dụ : #yum clean all

Group install

yum groupinstall "groupname"

171

Bổ sung, loại bỏ và nâng cấp phần mềm trên Fedora

Chƣơng trình Add/Remove Applications – đây là cách đơn giản nhất để quản l. các phần mềm trong Fedora

Synaptic – Đây là một chƣơng trình cao cấp để quản lý phần mềm ở chế độ đồ hoạ.

APT – Đây là một câu lệnh rất mạnh, dùng ở chế đọ Terminal hoặc console, cho phép quản lý các gói phần mềm.

$su

$yum install apt

2. Yumex – Fedora

# yum install yumex.noarch (quyền root)

173

Quản lý gói phần mềm bằng lệnh APT : # yum install apt

Cài đặt một gói phần mềm :

#sudo apt-get install <tên_gói_phần_mềm>

Loại bỏ một gói phần mềm :

#sudo apt-get remove <tên_gói_phần_mềm>

Tải xuống và cập nhật danh sách các gói phần mềm :

#sudo apt-get update

Nâng cấp hệ thống với các gói phần mềm mới hơn :

#sudo apt-get upgrade

Liệt kê các lệnh và lựa chọn đƣợc dùng với APT :

#apt-get help

Bổ sung thêm kho phần mềm 175

E M A I L : H O A N G V I N H @ F R E E . F R

Soan thảo trên Linux

Chương trinh soan thảo vi

Vi la môt editor chuân trên hê thống UNIX

Hoat động dưới 2 chế độ :

Insert mode

Standard command mode

Kích hoat bằng phím và Esc

Ví dụ : $ vi thiduvi.txt

Di chuyển chuột

Vi sử dụng 4 phím hjkl để di chuyển trong command

mode.

h – di chuyển sang trái

j – di chuyển xuống

k – di chuyển lên

l – di chuyển sang phải

) - cuối câu

( - đầu câu

} - đầu đoan văn

{ - cuối đoan văn

Điều khiển

u : Undo lai thao tác trước đó

dw - xóa 1 từ

d^ - xóa ký tự từ con trỏ đến đầu dòng

3dw - xóa 3 từ

d$ - xóa ký tự từ con trỏ đến cuối dòng

dd - xóa dòng hiện hành

Thao tác trên tập tin

:w - ghi vào tập tin

:x - lưu và thoát khỏi chế độ soan thảo

:wq - lưu và thoát khỏi chế độ soan thảo

:q - thoát nếu ko có thay đổi

:q! - thoát không lưu

LẬP TRÌNH SHELL

[email protected]

Nội dung

Kernel Shell và lập trình Shell

Kernel ?

Kernel là trái tim của HĐH Linux Đảm nhận các vai trò sau :

Quản lý I/O Quản lý tiến trình(process) Quản lý tập tin Quản lý thiết bị Quản lý bộ nhớ

Linux Shell

Shell giúp cho chúng ta :

Công việc của Shell

Các loại Shell trên Linux5

Bourne shell: còn gọi là sh, do Steve Bourne tạo ra C-shell: còn gọi là csh, đi kèm với BSD UNIX Korn shell: còn gọi là ksh, do David Korn tạo ra Born Again shell: còn gọi là bash, tương tự nhưng

mới hơn Bourne shell. Bash là shell mặc định củaLinux

Người dùng có thể chuyển đổi giữa các shell Hiển thị Shell : # echo $SHELL

Sử dụng Shell

$ date --help $ man ls $ info bash

Tiến trình (Process)

Tiến trình là một loại chương trình đảm nhiệm bởiPC. # ls –lR

Tại sao cần tiến trình ? # ls / -R | wc –l # ls / -R | wc -l &

Minh họa tiến trình

Xem tất cả các tiến trình $ps kill {PID} $ ps –ag : Lấy thông tin từ các tiến trình đang chạy $ kill 0 : tắt tất cả process ngoại trừ Shell đang

dùng

9

Các lệnh quản lý tiến trình

Lệnh ps: Xem danh sách các tiến trình$ps$ps aux

Lệnh kill: Hủy tiến trình$kill 1653$kill -s SIGTERM 1653

Lệnh top: Xem tần suất sử dụng tài nguyên của các tiến trình$top

Chuyển đổi người dùng10

Lệnh id : Hiển thị định danh người dùng hiện thời$id

Lệnh su : Chuyển đổi người dùng hiện thời$su

$su user1

Liệt kê người dùng Lệnh who: Liệt kê những người dùng đang đăng nhập

$ who

11

Tắt và khởi động lại máy

Lệnh shutdown: Tắt máy$shutdown -h now$shutdown -h -t5

Lệnh reboot: Khởi động lại máy$reboot$shutdown -r now

Gắn các ổ đĩa

• Lệnh mount: Gắn các ổ đĩa$mount /dev/cdrom /mnt/cdrom

• Lệnh umount: Gỡ bỏ các ổ đĩa$umount /mnt/cdrom

Phím điều khiển12

Ctrl-C, Ctrl-\: Kết thúc tiến trình hiện thờiCtrl-Z: Tạm dừng tiến trình hiện thờiCtrl-D: Kết thúc việc nhập liệuCtrl-U: Xóa toàn bộ dòng lệnh bên trái con trỏCtrl-W: Xóa một từ bên trái con trỏCtrl-A: Di chuyển đến đầu dòng lệnhCtrl-E: Di chuyển đến cuối dòng lệnh

Phím điều khiển13

Các phím di chuyển Phím mũi tên lên, xuống: di chuyển trong lịch sử các lệnh đã

được gõ Phím mũi tên trái, phải: di chuyển trong dòng lệnh Phím BACKSPACE: xóa ký tự bên trái con trỏ Phím ENTER: thực thi lệnh• Lệnh history: Làm việc với lịch sử các lệnh đã được gõ

$history$!2

!! : thực thi lệnh vừa được gõ!pw : thực thi lệnh đã được gõ bắt đầu bằng pw!$ : sử dụng đối số đã được gõ!* : sử dụng lại tất cả đối số của lệnh vừa được gõ

Thao tác phím14

Khả năng tự hoàn tất Sử dụng phím TAB để hoàn tất lệnh hay tên tập tin, tên thư mụcMột số ký tự đặc biệt # đặt ở đầu dòng lệnh, đánh dấu dòng lệnh như là chú thích ; ngăn cách các lệnh, cho phép đánh nhiều lệnh trên một dòng & đặt ở cuối dòng lệnh, cho phép chạy lệnh ở chế độ nền (dấu nhắc

sẽ lập tức hiện ra) \ tiếp tục dòng lệnh ở dòng mới | chuyển đầu ra của lệnh này thành đầu vào của lệnh kia (;) Gộp các lệnh trong dấu () các lệnh được phân cách bởi “;”

15

Cú pháp lệnh

Cú pháp chung Command [Options] [Argument] Command = Tên lệnh Options = Các tùy chọn của lệnh Argument = Các đối số của lệnh

Các ký hiệu đại diện nhóm tập tin16

“*” đại diện cho một chuỗi (có thể rỗng) các ký tự bất kỳ “?” đại diện cho một ký tự bất kỳ “[ ]” đại diện cho một ký tự bất kỳ trong ngoặc vuông, có

thể sử dụng dấu - để liệt kê một khoảng ký tự liền nhau

Chuyển hướng Input <-> Output

Trong Linux có thể chuyển Output thành input $ ls> filename

Có 3 loại chuyển hướng : > ; >>; < > Redirector Symbol $ ls > myfiles # ghi đè thông tin nếu đã tồn tại file

>> Redirector Symbol Syntax: Linux-command >> filename $ date >> myfiles # thêm thông tin vào phần cuối của file

< Redirector Symbol Linux-command < filename $ cat < myfiles # Nhận đầu vào lệnh vào tập tin

Ống dẫn (pipe)

Ống dẫn là cách để kết nối output của một chươngtrình thành input của một chương trình khác màkhông dùng file tạm

Ống dẫn thường dùng đễ thực thi nhiều hơn 1 câulệnh trên cùng một dòng.

Cú pháp : command1 | command2

Lập trình Shell

Chương trình shell là một loạt các câu lệnh. Biến trong Shell :

Biến hệ thống (System variables ) Biến do người dùng định nghĩa (User defined variables

UDV)

Một vài biến hệ thống

Xem các biến trong hệ thống $set |more

System Variable Meaning

BASH=/bin/bash Our shell name

BASH_VERSION='4.2.24(1)-release' Our shell version name

COLUMNS=65 No. of columns for our screen

HOME=/home/anhpham Our home directory

PATH=/usr/lib/ccache Our path settings

USER=anhpham User name who is currently login to this PC

Ưu và nhược của Shells

Ưu điểm : Ngôn ngữ diễn dịch : dễ dàng dò tìm và phát hiện lỗi;

thay đổi chỉnh sửa script không cần phải biên dịch lạitừ đầu.

Ngôn ngữ phù hợp với ứng dụng : ống nối, thay thếlệnh và các biến trong môi trường Unix

Cho phép kết nối các thành phần với các ngôn ngữkhác : Input-Output dẫn xuất : các biến, lỗi, kết quả…

Ưu và nhược của Shells

Nhược điểm : Bắt nguồn từ Unix, ngôn ngữ lập trình dùng để lập trình, cú

pháp của shell không dễ tiếp cận cho người mới bắt đầu. Thêm hoặc bớt khoảng trắng trong câu lệnh sẽ gây lỗi cú

pháp bash sở hữu nhiều cú pháp để thao tác cùng một chức năng

=> đôi khi gây ra sự không tương thích với các phiên bảnshell

Các ký tự đặc biệt dùng trong câu lệnh sẽ có ý nghĩa khácnhau trong từng hoàn cảnh khác nhau, gây khó khăn khi sửdụng

Định nghĩa biến người dùng

Cú pháp : variablename = value Ví dụ :

$ a=90 # this is ok $ 90=a # Error, NOT Ok, giá trị phải ở bên phải

Định nghĩa biến ‘xe' có giá trị Bus $ xe=Bus

Định nghĩa biến n có giá trị 10 $ n=10

Quy tắc đặt tên biến ( UDV và System Variable)

Tên biến phải bắt đầu bằng 1 ký tự chữ cái hoặc (_), được tiếp bởi1 ký tự chữ cái.

Biến hợp lệ : HOME SYSTEM_VERSION no

Không dùng khoảng trắng trước và sau dấu “=” $ no =10 #không hợp lệ $ no= 10 #không hợp lệ $ no = 10 #không hợp lệ $ no=10 # OK

Biến phân biệt chữ hoa và chữ thường $ No=11 $ NO=20 $ nO=2

Quy tắc đặt tên biến ( UDV và System Variable)

Có thể đặt biến NULL như sau: $ no= $ no=“” Không dùng ?,* etc để đặt tên biến

Để xuất giá trị biến, thêm vào $ $ no=10 $ echo $no

Ví dụ minh hoạ

Định nghĩa biến x có giá trị 3 và xuất ra màn hình $ x=3 $ echo $x

Định nghĩa biến k có giá trị xy $ k=xyi $ echo $k

In tổng của hai số $ echo 6 + 3 $ expr 6 + 3 $ expr 6+3

Viết Shell script

Ctrl + D Để thực thi shell :

$ ./firstshell --.error $ chmod +x firstshell $ ./first

$ cat > first shell## My first shell script#clearecho “test"

Làm thế nào sử dụng Shell

chmod để gán quyền execute cho script Cú pháp : chmod +x shell-script-name

chmod 777 shell-script-name

Thực thi script : Cú pháp : ./shell-program-nameVí dụ : $ ./first

Hoặc : $ bash shell-program-name $ /bin/sh shell-program-name

Làm thế nào sử dụng Shell

$ /bin/sh /home/vinhth/shellscript Thư mục /bin chứa các file thực thi. Có thể chạy

script trực tiếp khi copy vào thư mục /bin $ cp first ~/bin $ first

Một số lệnh liên quan đến lập trình Shell

echo [options] [string, variables...] -n : không in ký tự xuống dòng. -e : cho phép hiểu những ký tự theo sau dấu trong chuỗi a : alert (tiếng chuông) b : backspace c : không xuống dòng n : xuống dòng r : về đầu dòng t : tab : dấu

Một số lệnh liên quan đến lập trình Shell

Dấu nháy kép - “Double Quotes” : tất cả trong “” sẽ đượcbỏ qua (ngoại trừ \ và $)

Dấu nháy đơn – ‘Single quotes’ : tất cả trong ‘’ không thayđổi

Dấu nháy huyền- `Back quotes`: thực thi câu lệnh $ echo “Today is date” ( Xuất chuỗi ) $ echo "Today is `date`". ( Xuất giá trị ngày)

Shell và số học : $ expr 1 + 3 (CHÚ Ý KHOẢNG TRẮNG) $ echo "expr 6 + 3” $ expr 10 \* 3 (PHÉP NHÂN : \*) $ $ echo "expr 6 + 3" # Xuất : expr 6 + 3 $ echo 'expr 6 + 3' # Xuất : expr 6 + 3

Một số lệnh liên quan đến lập trìnhShell echo $(( 20 + 5 )) x=5

echo $(( x++ ))echo $(( x++ ))

x=2y=3echo $(( x ** y ))

Tính toán trên Shell

$ bc # tính toán trên Linux 5 – 2 7 5 / 2 5 > 2 0 # trả lời của hệ thống 5 > 12 5 == 10 5 != 2 5 == 5 12 < 2

Xử lý câu lệnh

Thực hiện câu lệnh với 1 file không tồn tại $ ls file_luu_tru $ file_luu_tru : No such file or directory

Sự cần thiết của tham số trong câulệnh $ rm {file-name} $ ls -a /*

Ví dụ minh họa

Lưu script Ctrl+d $ chmod +x demo $ ./demo Hello World $ cp demo ~/bin $ demo

$ cat > demo#!/bin/sh## Script that demos, command line #echo "Total number of command line argument are $#"echo "$0 is script name"echo "$1 is first argument"echo $2 is second argument"echo "All of them are :- $*"

Trạng thái thoát

Mặc định sau khi kết thúc câu lệnh, hệ thống sẽ trả về 2 giátrị : Lệnh thành công, giá trị =0 Lệnh không thành công, lỗi : giá trị >0

$ rm thu_muc rm: cannot remove thu_muc': No such file or directory $ echo $? $ ls $ echo $?

CẤU TRÚC ĐIỀU KHIỂN

[email protected]

Cấu trúc : if..fi

$cat sho $echo $ $ chmod +x sho $./sho fs $ ./sho foo

if conditionthen

command1 if condition is true or if exit statusof condition is 0 (zero)......

fi

$ cat > sho#!/bin/sh##Script to print file#if cat $1then

echo -e "\n\nFile $1, found and successfully echoed"Fi

Cấu trúc : if..fi

$ chmod +x trmif cat > trmif## Script to test rm command and exist status#if rm $1then

echo "$1 file deleted"fi

Cấu trúc : if..fi – kiểm tra biểu thức

$ chmod +x soduong $ ./soduong 5 $./soduong -45

$./soduong ./soduong: test: -gt: unary operator expected

$ cat > soduong#!/bin/sh## Script to see whether argument is positive#if test $1 -gt 0then

echo "$1 number is positive"fi

Toán tử trong Shell Script

Toán tử trong Shell Script

Toán tử trên chuỗi :

Trên file

Kết hợp

Cấu trúc : if...else...fiif condition

thencommand1 if condition is true or

if exit statusof condition is 0(zero)......

elsecommand2 if condition is false or

if exit statusof condition is >0 (nonzero)......

fi

$ cat > kiemtra#!/bin/sh## kiem tra so duong hay am#if [ $# -eq 0 ]thenecho "$0 : You must give/supply one integers"exit 1fi

if test $1 -gt 0thenecho "$1 number is positive"elseecho "$1 number is negative"fi

Cấu trúc if-then-else lồng nhauif condition

thencondition is zero (true - 0)execute all commands up to elif

statementelif condition1

condition1 is zero (true - 0)execute all commands up to elif

statement elif condition2

condition2 is zero (true - 0)execute all commands up to elif

statement else

None of the above condtion,condtion1,condtion2 are true (i.e.

all of the above nonzero or false)execute all commands up to fi

fi

$ cat > etf#!/bin/sh# Script to test if..elif...else#if [ $1 -gt 0 ]; then

echo "$1 is positive"elif [ $1 -lt 0 ]then

echo "$1 is negative"elif [ $1 -eq 0 ]then

echo "$1 is zero"else

echo "$1 is not number, give number"fi

Vòng lặp for for { variable name } in { list }

doexecute one for each item in the

list until the list isnot finished (And repeat all

statement between do and done)done

$ cat > testfor#!/bin/shfor i in 1 2 3 4 5do

echo “Xin chao $i times"done

Vòng lặp for $ cat > mtable#!/bin/sh# kiem tra vong lapif [ $# -eq 0 ]thenecho "Error – Cau lenh sai"echo "Syntax : $0 number"echo “Xuat ra bang cuu chuong"exit 1fin=$1for i in 1 2 3 4 5 6 7 8 9 10doecho "$n * $i = `expr $i \* $n`"done

Vòng lặp while

while [ condition ]do

command1command2command3......

done

$cat > nwhile#!/bin/sh#Script to test while statement#if [ $# -eq 0 ]then

echo "Error – Cau lenh sai"echo "Syntax : $0 number"echo " In ra bang cuu chuong"

exit 1fin=$1i=1while [ $i -le 10 ]doecho "$n * $i = `expr $i \* $n`"i=`expr $i + 1`

done

Cấu trúc in case case $variable-name in

pattern1) command.....command;;

pattern2) command...

..command;;

patternN) command.....command;;

*) command.....command;;

esac

$ cat > car# if no vehicle name is given# i.e. -z $1 is defined and it is NULL# if no command line argif [ -z $1 ]then

rental="*** Unknown vehicle ***"elif [ -n $1 ]then# otherwise make first arg as rental

rental=$1ficase $rental in

“xehoi") echo "For $rental Rs.20 per k/m";;“xedap") echo "For $rental Rs.5 per k/m";;

“honda") echo "For $rental 20 paisa per k/m";;*) echo "Sorry, I can not gat a $rental for you";;

esac

Lệnh break và continue

#!/bin/sha=10while [ $a -lt 10 ]do

echo $aa=`expr $a + 1`

done

$cat breaktest#!/bin/sh

a=0

while [ $a -lt 10 ]do

echo $aif [ $a -eq 5 ]then

breakfia=`expr $a + 1`

done

Lệnh break và continue

$ cat >continuetest#!/bin/sh

NUMS="1 2 3 4 5 6 7"

for NUM in $NUMSdo

Q=`expr $NUM % 2`if [ $Q -eq 0 ]then

echo "Number is an even number!!"continue

fiecho "Found odd number"

done

Câu lệnh read

Cú pháp : read varible1, varible2,...varibleN

$ cat > sayhello##Script to read your name from key-board#echo "Your first name please:"read fnameecho "Hello $fname, Lets be friend!"

command1;command2

$ date;who

- Chức năng: Cho phép ước lượng một biểu thức chứabiến

- Ví dụ:foo=10

x=foo

y=‘$’$x

echo $y

Kết quả $foo

Dùng lệnh evanfoo=10x=fooeval y=‘$’$xecho $yKết quả : 10

Lệnh eval

Lệnh exec- Chức năng: Dùng để gọi một lệnh bên ngoài khác. Thông thườnglệnh exec sẽ gọi một shell phụ khác với shell mà script đang thực thi

Lệnh exit n- Chức năng: Dùng để thoát ra khỏi shell đang gọi và trả về mã lỗi n- Mã lỗi ‘0’ được coi là thành công

Lệnh exec và exit

Lệnh printf- Chức năng: Tương tự như lệnh printf của thư viện C- Danh sách các ký tự đặc biệt dùng chung với dấu “\”, gọi là chuỗithoát

Lệnh return- Chức năng: Trả về giá trị của hàm

Lệnh set- Chức năng: Dùng để thiết lập giá trị cho các tham số môi trường như$1,$2,$3,v.v... Ngoài ra, lệnh này còn có chức năng loại bỏ nhữngkhoảng trắng không cân thiết và đặt nội dung của chuỗi truyền cho nóvào các biến tham số#set This is parameter#echo $1This#echo $2is

Lệnh return và set

Lệnh shift- Chức năng: Di chuyển nội dung các tham số môi trường $1, $2,$3,v.v... xuống một vị trí. (Do ta chỉ có tối đa 9 tham số $1..$9)

Lệnh trap(tham khảo thêm)

Lệnh shift, trap

- Chức năng: Loại bỏ biến khỏi môi trường shell

- Lệnh unset rất ít được sử dụng

- Ví dụ:

#!/bin/shfoo=“Hello World”echo $foounset fooecho $foo

- Kết quả chương trình sẽ in ra chuỗi rỗng (do lúc này biến foo không tồn tại nữa)

Lệnh unset

Lệnh đi kèm /dev/null

Cú pháp : command > /dev/null : gửi tới nhữngoutput không muốn xuất hiện

$ ls > /dev/null

Biến cục bộ và toàn cục

Biến cục bộ (local variables) là các biến ta sử dụng. Nếu tải bảncopy của shell $/bin/bash, shell mới sẽ bõ qua tất cả các biến cũ

Ví dụ :$x=5$echo $x5$/bin/bash$echo $xNOTE:-Empty line printed$x=7$exit$echo $x

Từ khóa export

Có thể copy biến shell cũ tới shell mới, biến như vậy gọi làbiến toàn cục.

Cú pháp : export variable1, variable2,.....variableN $ xe=Bus $ echo $xe Bus $ export xe $ /bin/bash $ echo $xe Bus $ exit $ echo $xe

Điều kiện thực th: && và ||

Toán tử điều khiển : && : AND Cú pháp command1 && command2 : command1 được thực

thi, iff command1 trả về giá trị thoát 0. || : OR Cú pháp : command1 || command2 : command2 được thực

thi iff command1 trả về giá trị thoát non-zeroHoặc :command1 && comamnd2 if exist status is zero || command3 if exit status is non-zero

Input – Output chuyển hướng

$ cat > myft This is my file # ctrl D $ cal $ cal >myfile #lưu $ cat >number $sort <number

Input – Output chuyển hướng

$cat >demosc#!/bin/shif [ $# -ne 2 ]then

echo "Error : Number are not supplied"echo "Usage : $0 number1 number2"exit 1

fians=`expr $1 + $2`echo "Sum is $ans"

Hàm

Hàm có vai trò quan trọng trong Shellfunction-name ( )

{command1command2........commandNreturn

}

$ SayHello(){echo "Hello $LOGNAME !”return}

Dò lỗi – debug trong shell

- Do script là lệnh văn bản được shell thông dịch nênviệc dò lỗi không khó như các chương trình biên dịchnhị phân

- Quá trình dò lỗi thì shell sẽ in ra số thứ tự của dònggây lỗi. Ta cũng có thể thêm vào lệnh echo để in ra nộidung của các biến có khả năng gây lỗi cho chương trình

Có thể dùng set để đặt một số tùy chọn cho shell hoặcđặt thêm tham số khi gọi shell thực thi script

$ bash -x script-name$ bash -x domains.sh

Một số tùy chọn khi dùng lệnh set70

71

Xử lý chuỗi

1. Khởi tạo một chuỗistring=abcDefghu1234EDstuV2. Lấy độ dài một chuỗi$ echo {#string}

echo `expr length $string` echo `expr "$string" : ".*"`

3. Định vị một ký tự trong string$ echo `expr index "$string" c ` $echo `expr index "$string" E`

72

stringZ=abcABC123ABCabc4.Lọc N ký tự đầu tiên của chuỗi$echo ${stringZ:0}echo ${stringZ:7:3} # lấy từ vị trí thứ 7, 3 ký tự5.Lọc các ký tự từ đầu chuỗi trừ N ký tự cuối cùng${string: -N} echo ${stringZ:-4} echo ${stringZ:(-4)}6.Lọc N ký tự bắt đầu từ ký tự số Mecho `expr substr $string M N `7.Lọc các ký tự từ a* đến u (đầu tiên) $ echo ${stringZ#a*C} # 123ABCabc$echo ${stringZ#a*3}

Xử lý chuỗi

73

stringZ=abcABC123ABCabc$echo ${stringZ#*123}${stringZ%kytu* kytu} #abcDef1234ED${stringZ%substr* kytu} #abcDefghu1${stringZ%%kytu* kytu} #abcDefgh${string/substr/replacement} #xyzDefghu1234EdstuV

$ echo ${stringZ% *} : xóa từ bên phải

Xử lý chuỗi

74

12. Loc N ký tự kể từ ký tự thứ M vd : N=3 , M=4read Necho `expr substr $string $M $N ` # Def13.Lọc các ký tự kể từ chuỗi con “substr”string1=xyzabcd123xyzthung{string1%%substr*} #xyz14. Lọc N ký tự đầu tiên${string1:N} #N=3:abcd123xyzthung${string1#kytu*kytu} #abcd123xyzthung15.Lọc các ký tự kể từ substr trở về trươc${string1##*substr}#thung

Xử lý chuỗi

75

Xử lý chuỗi trong shell

#!/bin/bashstring=abcDefghu1234EDstuVecho ${#string} 19echo `expr lengt#h $string` #19echo `expr index "$string" c ` #3echo `expr index "$string" E ` #14echo ${string:2} # cDefghEDstuVFecho ${string: -3} # tuVecho `expr substr $string 3 5 `# cDefgecho ${string#a*u} # 1234EDstuV

76

Xử lý chuỗi trong script

echo ${string#*123} #4EDstuVecho ${string##a*u} # Vecho ${string%s*V} #abcDefghu1234EDecho ${string%234*V} #abcDefghu1echo ${string%%u*V} #abcDefghecho ${string/abc/xyz} #xyzDefghu1234EDstuV

read Necho `expr substr $string 3 $N `

77

Xử lý mảng

array[xx]1.Khai báo mảng : declare –a array2. Lấy gia trị mảng : ${array[xx]}${array[@]} hoặc ${array[*]} : lây tât cả phân tư củamảng${#array[@]} hoăc ${#array[*]} : tông sô phân tư củamảngVí dụ :array[5]=`expr ${array[11]} + ${array[13]}`Một cách khácarray=( zero one two three four )-> array[0]=zero ; array[4]=four

78

Cách khác :array=( [xx]=XXX [yy]=YYY ...)array=([17]=seventeen [21]=twenty-one)Ví dụ :

array=( zero one two three four five )echo ${array[0]} # zeroecho ${array:0} # zeroecho ${array:1} # ero : lâý từ vị trí số 1 cuả phân tử thư nhất

Xử lý mảng

79

arrayZ=( one two three four five five )

echo ${#array[0]} # 3 : chiều dai cua phần tư thư nhấtecho ${#array} # 4echo ${#array[1]} # 3 : chiều dai cua phần tư thư 2echo ${#array[*]} # 6 : sô phần tư của mảngecho ${#array[@]} # 6 : sô phân tư của mảng.Ví dụ :array2=( [0]="first element" [1]="second element" [3]="fourth element" )echo ${array2[0]} # first elementecho ${array2[1]} # second elementecho ${array2[2]} # không khơi tao nên có gia trị nullecho ${array2[3]} # fourth element

80

Xử lý mảng

Ví dụ :arrayZ=( one two three four five five )echo ${arrayZ[@]:0} # one two three four five five echo ${arrayZ[@]:1} # two three four five five : lâý từ phân tử thứ 1

81

echo ${arrayZ[@] 2} # two three : lây phân tư 1 đến 2

Khai báo mảng rỗngarray0=( first second third )array1=( ' ' ) # "array1" có 1 phần tư rôñg.array2=( ) # mảng rỗng

82

Thêm phân tư vào mảng

array0=( "${array0[@]}" "new1" )# ${array0[@]} là toan bô mang cũ, new1 là phần tư mớiarray1=( "${array1[@]}" "new1" )array2=( "${array2[@]}" "new1" ) hoặcarray0[${#array0[*]}]="new2"array1[${#array1[*]}]="new2"array2[${#array2[*]}]="new2"

83

Sao chép mảngarray2=( "${array1[@]}" ) hoặcarray2="${array1[@]}"

2. Xóa mảng : unsetVí dụ : unset array[1] : xoa phân tư thư 2 củamảng arrayunset array : xóa tòan bô mảng

#!/bin/bashwhile :doclearecho "---------------------------------------"echo " Main Menu"echo "---------------------------------------"echo "[1] Show today date/time"echo "[2] Show all files in current directory"

Tạo menu tương tac vơi ngươi dùng.

85

echo "[3] Show calendar"echo "[4] Exit/Stop"echo "======================="echo -n "Enter your choice [1-4]: "read choicecase $choice in1) echo "Today is `date` "echo "Press Enter key to continue ..."; read;;2) echo "Files in $PWD"; ls -lecho "Press Enter key to continue..."; read;;3) cal ; echo "Press Enter key to continue..."; read;;4) exit 0;;*) echo "Please choice 1,2,3,4. Press Enter key to continue..."; read;;esacdone

Tạo menu tương tac vơi ngươi dùng.

LẬP TRÌNH C TRÊN LINUX

Nội dung

Ngôn ngữ C Minh họa Hello world

Ngôn ngữ C – điều kiện cần

3 công cụ cần thiết để viết lập trình trên ngôn ngữC : Trình soạn thảo ( text editor) : vi, gedit Trình biên dịch ( compiler) : GNU Compiler Collection

(GCC) $ gcc

Thư viện chuẩn của C ( C standard library) : glibc $ locate glibc

"Hello, World!" Source Code

#include <stdio.h>

main(){printf("Hello, world!\n");return 0;}

Phân tích "Hello, World!"

Dòng đầu tiên trong ngôn ngữ C : preprossordirective và luôn bắt đầu bằng dấu #.

Hàm main () Dấu ;

Compile hello.c

Biên dịch chương trình hello.c bằng gcc như sau : $Gcc –o hello hello.c -o : tạo ra file thực thi $ ls hello.c hello $./hello

7

Nhập môn lập trình Linux

UNIX – Hệ điều hành server mạnh , được thử thách qua thời gian. Chưa có đối Windows 2000 server ra đời – cạnh tranh với UNIX Cả UNIX và Win 2k sản phẩm có bản quyền ( Mặc dù Unix là sảnphẩm mã nguồn mở - SUN đã thương mại hóa) Linux ra đời trên nền tảng Unix , được toàn cộng đồng phát triển vàlà sản phẩm mã nguồn mở rất phổ biến Linux là kernel cung cấp những chức năng tối thiểu của OS Unix. Ưu điểm Linux : Ổn định, biến.tính kế thừa. Mọi chương trình trênUnix đều có thể chạy trên Linux ( Giống nhau 98%)

Cộng đồng mã nguồn mở GNU8

Cộng đồng GNU ( “Gnu is Not Unix”) đã xây dựng nhiều ứngdụng trên Unix (Linux) : Word proccessing ,Office, Game, Multimedia, networking và các compiler , interpriter , programming languages… GNU – Phi lợi nhuận song cần tuân thủ một số quy định về bảnquyền của GNU - GPL (General Public License) – “copyleft”( thay cho “copyright”)GNU cung cấp bộ biên dịch C/C++bao gồm :

gcc trình biên dịch C g++ trình biên dịch C++ gdb Debug GNU make Trình quản lý mã nguồn và trợ giúp biên dịch bash shell

Lập trình trên Linux9

Ngôn ngữ C hỗ trợ rất tốt cho lập trình trên Linux.Tuy nhiên nókhông phải là lựa chọn duy nhất.Có thể dùng Pascal , Assembler , Perl , Java , PHP… Chương trình Linux tồn tại trên hai dạng : thực thi ( file binary) giống như file *.exe trong DOS và thông dịch (script) giống nhưfile *.bat . Hai dạng file này có thể hoán đổi cho nhau . Để chaychương trình cần cấp quyền thực thi “x” Đường dẫn tới tập tin binary /bin/,/user/bin,user/local/bin ,./ Cài biến môi trườngPATH = /bin:/user/bin:/user/local/bin:.

10

Phát triển chương trình trên ngôn ngữ c

Chương trình trên Linux Trình biên dịch gcc thường nằm trong /usr/bin hoặc /usr/local/bin. Khi biên dịch nó cần sự hỗ trợ của các file C header trong/usr/include hoặc /usr/local/include Các thư viện liên kết nằm trong /lib hoặc /usr/local/lib. Các thư viện chuẩn của gcc nằm trong /usr/lib/gcc-lib Chương trình nhị phân có thể nằm ở bất kỳ đâu song khi thực thi ta cần chỉ đường dẫn thông qua biến môi trường PATH

Header file11

Định nghĩa hàm , khai báo các hằng với cấu trúc dữ liệu cần thiếtkhi biên dịch.Các header năm trong /usr/include;/usr/local/includehoặc các thư mục con /usr/include/asm hoặc /usr/include/sys vídụ :#include <sys/types>.hMột số đường dẫn đến các file header mặc định như/usr/include/g++-2 (dùng cho trình biên dịch C++)Nếu muốn tổ chức các header của riêng mình nằm ngoài thư mục

mặc định , ta phải chỉ rõ đường dẫn đến thư mục đó khi biên dịchbằng tùy chọn –Igcc –I/usr/mypro/include test.c –o test

12

Khi sử dụng hàm nào đó của thư viện hệ thống , để biêthàm này được định nghĩa trong file header nào ta dùnglệnh man.Ví dụ hàm kill() $man 2 kill

Sử dụng hai file header

sys/types.h và signal.h

Các file thư viện13

Dùng để trình biên dịch bắt lỗi cú pháp , kiểm tra kiểu chương trình vàtạo các object file.Trong Linux các file thư viện có phần mở rộng là.a,.sohoặc.sa và bắt đầu bằng lib . ví dụ libutil.a ; libc.soHai loại liên kết :Static Link Library (.a) và Dinamic Link Library(.so) Dùng lệnh ls /usr/lib để xem các thư viện

Tạo object file (.o) dùng tùy chọn –c ( giống .obj) trên CThư viện liên kết tĩnh : Trình biên dịch lấy toàn bộ mã thực thi của hàm thư việnvà đưa vào chương trình chính.Ví dụ program.c

a. Tạo hai thư viện đối tượng từ mã nguồn bob.c vàalice.c bob.o và alice.o

Thư viện

16

Xây dựng hàm lib.h$gedit lib.h

Viết hàm program.c17

18

File thư viện .a là file chứa tập hợp các file thư viện đối tượng.o , là một dạng file nén được tạo bởi lệnh ar

Đã có thư viện libfoo.a , ta liên kết lại với chươngtrình chính

19

Tương thích giữa Linux và Windows/DOS

Linux Windows/DOS Ý nghĩa

func.o func.obj File đối tượng

lib.a lib.lib Static link lib

program program.exe Execute file

lib.so lib.dll Dinamic link lib

20

Thư viện liên kết động

Nhược điểm của TVLK tĩnh : Nhúng mã nhị phân vào chươngtrình khi biên dịch. Rất tốn không gian bộ nhớ và phải biêndịch lại mỗi khi thay đổi chương trình.

Thư viện liên kết động giải quyết vấn đề trên.Trình liên kết chỉlưu các tham chiếu đến các hàm trong thư viện liên kết .Khithực thi , HDH sẽ chính thức nạp thư viện liên kết cần thiếtvào bộ nhớ.Như vậy , nhiều chương trình có thể sử dụng chungmột DLL duy nhất.

Thư viện liên kết động trong Linux có phần mở rộng .so Để biên dịch file thư viện để đưa vào liên kếtsử dụng tùy

chọn –fpic hoặc –fPIC (Position Independence Code)

21

Tạo file đối tượng cho DLLTạo liên kết động cho các file .o trên – Dùng tùy chọn

–shared# chỉ đường dẫn đến thư mục chưa libfoo.so

Biên dịch lại program.cKiểm tra HDH có tìm ra các file thư viện liên kết động

dùng lệnh ldd

22

CÁC CÔNG CỤ QUẢN LÝ HỖ TRỢ LẬP TRÌNH

QUẢN LÝ NHIỀU MÃ NGUỒNVấn đề nảy sinh khi phát triển những phần mềm lớn là phải biêndịch nhiều lần các mã nguồn . Linux cung cấp cho ta công cụmake . Công cụ này đảm bảo chỉ những file thay đổi nội dung mới phải biên dịch lại.Công cụ make còn được dùng để tạo ramột file kết xuất từ nhiều file nguồn khác nhau.Ngoài ra makecòn được sử dụng rất nhiều trong việc quản lý gói , cài đặt , gỡbỏ các ứng dụng …Có nhiều loại makefile khác nhau như phiên bản thử nghiệm(trail) , phiên bản chính thức hay (beta), phiên bản dò lỗi(Debug). Các makefile khác nhau có thể sử dụng để biên dịch cácphần khác nhau của dự án.

23

Tập tin makefile

Chương trình make không tự nó tạo ra các ứng dụng , nó phảiđược hướng dẫn , lập trình viên phải tạo ra một file chứa thôngtin hướng dẫn chương trình make cách úng dụng sẽ được xâydựng và biên dịch.File chứa thông tin đó goi là makefile

Tập tin makefile thường đặc tả các phụ thuộc và các quy tắcdẫn đến phụ thuộc.Một phụ thuộc (dependences) gồm nhiềufile liên quan đến nhau và cùng có một mục đích (tagget).Quytắc (rules) là các hướng dẫn hay quy định để các file phụ thuốctạo ra kết quả. Thông thường file đích hay file kết quả là cácfile thư viện .o hay .out

Cú pháp sử dụng trong makefile24

Các tham số và tùy chọn :Ba tùy chọn thông dụng nhấtlà :

-k yêu cầu make “cứ tiếp tục” chạy khi phát sinh lỗithay vì phải dừng khi có lỗi đầu tiên.

-n yêu cầu make in ra các thao tác mà nó thực thisong không thực thi các thao tác đó để xuất ra kếtquả

-f <filename> chỉ định tập tin mà make phải diễndịch. Nếu không có tùy chọn –f , trình make sẽ diễndịch file có tên là makefile hoặc Makefile ngaytrong thư mục hiện hành nơi chứa makefile

25

Để tạo ra file thực thi , ta phải truyền tên file thực thicho make thông qua tham số dòng lệnh. Nếu khôngmake sẽ chọn tên file đích đầu tiên mà nó tìm đượclàm tên của chương trìnhVí dụ : $make # tương đương với

$make makefileThông thường từ khóa all được chọn như tập tin đíchđầu tiên trong make .Sau đó các file đích khác đều phụthuộc vào file ban đầu này.

all : myapp myapp.1

Cú pháp sử dụng trong makefile

Xây dựng các phụ thuộc (dependences)26

Các phụ thuộc xác lập mối quan hệ giữa các file nguồn trongứng dụng.Trong makefile ta xây dựng các phụ thuộc bằngcách viết tên file đích đầu tiên , tiếp theo là dấu “:” Kế đến làcác file phụ thuộc các nhau bằng khoảng trắng hay“tab”. Ví dụ :myapp: main.o 2.o 3.omain.o: main.c a.h2.o: 2.c a.h b.h3.o: 3.c b.h c.hMakefile trên cho ta biết sự phụ thuộc của myapp vào main.o và 3.o ; main.o phụ thuộc vào main.c và a.h;2.o phụ thuộc vào 2.c,a.h và b.h....

27

Xây dựng các quy tắcSau khi xác định các phụ thuộc , ta cần chỉ rõ các quy tắc hay

cách thức tạo ra các file đích.Quy tắc chính là câu trả lời cho câu hỏi “ phải làm gì để tạo ra file đích?” ví dụ để tạo 2.o lệnh gì sẽ phải sử dụng ? . Đó chính là gcc –c 2.c.

Cần lưu ý các quy tắc phải được ghi thụt đầu dòng vào 1 ”tab”. Cuối dòng cũng không để khoảng trắng . Một số trình make sẽ không chịu diễn đạt quy tắc nếu cuối dòng có khoảng trắng.Ta xét một ví dụ tổng quát dưới đây

28

- Tạo makefile1

29

- Chạy makefile1 với tùy chọn –f (do tên makefile không phải mắc định)

Dòng báo lỗi thông báo ta chưa có quy tắc để thực hiện makefile đích main.c. Tất nhiên rồi vì ta chưa có các file nguồn main.c,2.c,3.c để make thực hiện các quy tắc .Ta sẽ tạo ra các file nguồn này.

Trước hết ta dùng lệnh touch để tạo các file header rỗng ( vì lệnh touch tạo ra các file rỗng).

30

Kế tiếp ta sẽ tạo ra các file nguồn main.c,2.c,3.c với nội dung sau:

31

Chạy lại make :

Trình make không thực hiện trình tự các quy tắc đã được liệt kê trong makefile . Make sẽ tìm đến đích mà myapp cần thiết phải biên dịch trước tiên (2.c).

32

Xóa 3.o xem thử make sẽ làm việc như thế nào?

Make sẽ nhận ra 3.o không có và sẽ tiến hành biên dịch lại 3.oSau đó thực hiện make theo quy tắc trong makefile. Trong makefile có thể dùng “#” để đánh dấu dòng chú thích (comment).Vì makefile là một trình cài đặt thật sự nên rất cần các chú thích tương ứng ,giúp người đọc chương trình rõ ràng và dễ hiểu hơn.

33

ĐIỀU KHIỂN MACRO BẰNG makefile

Macro được sử dụng để thay đổi các tùy chọn khi áp dụng các quy tắc biên dịch. Make hỗ trợ các lệnh điều khiển các macro bên trong makefile , giúp ta điềukhiển các hoạt động của makefile uyển chuyển hơn .Hỗ trợ cho việc biên dịch , gỡ rối được được thuận lợi bằng cách tối ưu hóa các tùy chọn .

Macro trong make được định nghĩa bởi cú phấp : MACRO=value ; #MACRO rỗng nếu sau dấu “=” LÀ KHOẢNG TRẮNG Để truy xuất giá trị của MACRO ta dùng cú pháp :

$(MACRONAME) hoặc $MACRONAME Thường MACRO được định nghĩa trong chương trình , tuy nhiên nó có thể được

định nghĩa trên dòng lệnhVí dụ khi cần định nghĩa trình biên dịch cần sử dụng là gcc ta viết CC=gcc . Macro được định nghĩa trên dòng lệnh có giá trị ưu tiên hơn được định nghĩatrong chương trình makefile.Ta sẽ tìm hiểu kỹ vấn đề này qua ví dụ makefile2dưới đây :

34

1.Dùng Text Editor tạo makefile2 có nội dung dưới đây . /*makefile2*/all: myapp#Trình biên dịch cần sử dụngCC=gcc# Thư mục chứa các file includeINCLUDE=.# Tùy chọn biên dịch trên dòng lệnh trong quá

trình phát triểnCFLAGS=-g –Wall –ansi# Tùy chọn trong quá trình hoàn thiện sản phẩmCFLAGS=-O –Wall –ansimyapp: main.o 2.o 3.o

$(CC) –o myapp main.o 2,o 3.omain.o: main.c a.h

$(CC) –I$(INCLUDE) $(CFLAGS) –c 2.o2.o: 2.c a.h b.h

$(CC) –I$(INCLUDE) $(CFLAGS) –c 3.c

35

2. Sau đó xóa hết các file *.o đã tạo trước đây :$rm *.o myapp3. Chạy lại make

36

QUẢN LÝ NHIỀU ĐÍCH (multi target)

/*makefile3*/all: myapp# Trình biên dịch cần sử dụngCC=gcc# Vị trí chứa file cài đặtINSTDIR=./# Thư mục chứa các file headerINCLUDE=./ # Tùy chọn biên dịch trên dòng lệnh trong q/t phát triểnCFLAGS=-g -Wall -ansi# Tùy chọn trong quá trình hoàn chỉnh sản phẩmCFLAGS=-O -Wall -ansi

37

# Đích biên dịch khi thực thimyapp: main.o 2.o 3.o

$(CC) -o myapp main.o 2.o 3.omain.o: main.c a.h

$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c2.o: 2.c a.h b.h

$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c3.o: 3.c b.h c.h

$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

38

# Đích thực hiện xóa các file trung gianclean:

-rm main.o 2.o 3.o# Đich thực hiện khi cài đặt,có thể bỏ phụ thuộc myapp nếu đã thực

hiện all: trứơc đóinstall: myapp

@if [ -d $(INSTDIR) ]; \then \# cp myapp $(INSTDIR); \chmod a+x $(INSTDIR)/myapp; \chmod og-w $(INSTDIR)/myapp; \echo "Install in $(INSTDIR)"; \else \echo "Sorry , $(INSTDIR) does not exist!"; \fi

39

Ký tự “-“ trước lệnh rm yêu cầu make không báo lỗi nếu các file.o khôngcó trên đĩa.

Ký tự “@” yêu cầu make không hiển thị lên màn hình console nội dung các lệnh thực thi trước khi lệnh được thực thi.

Ta sẽ thực thi makefile3 đối với các đích : Đầu tiên đối với đích all:

Lập trình PHP & MySQL

Công cụ sử dụng :Bộ cài đặt “PHP,MySQL,Apache”

EasyPHP 5.3

Xampp ( for windows or for Linux)

Thư mục làm việc: EasyPHP : /www

Xampp : /htdos

url:http://localhost/ ( 127.0.0.1)

Hostname: localhost;

username :root;

password:root

Ví dụ http://localhost/xampp

WB : Mozilla Firefox

PHẦN 1: NGÔN NGỮ PHP

Giới thiệu ngôn ngữ PHP

PHP - viết tắt của PHP Hypertext Preprocessor –

Do Rasmus Lerdorf phát triển từ một gói công cụ có tên là "Personal Home Pages" (nghĩa đầu tiên của PHP). (1994)

Được hoàn thành vào khoảng giữa năm 1995

Sau đó PHP được cải tiến và mở rộng bộ máy nhúng và bổ sung thêm một số hàm API đơn giản cho phép các lập trình viên khác tự do bổ sung nhiều tính năng vào ngôn ngữ bằng cách viết các module cho nó

Cấu trúc của ngôn ngữ được tinh chế, kết cấu thân thiện đối với những người sử dụng các ngôn ngữ hướng đối tượng hay các ngôn ngữ hướng thủ tục.

Xử lý các trang HTML

Cách thức hoạt động của hệ trình duyệt (Web Client) và máy chủ cung cấp dịch vụ Web (Web server ) :

Bước 1: Trình duyệt gửi một yêu cầu HTTP đến máy chủ, yêu cầu một file nào đó

Bước 2: Máy chủ sẽ chuyển yêu cầu này đến chương trình xử lý tương ứng, chính là chương trình Web server.

Bước 3: Web server phân tích chuỗi yêu cầu nhận được, kiểm tra khách yêu cầu gì. Nếu là các file bình thường (không phải là các file chứa các đoạn mã script thực thi phía máy chủ), nó sẽ tìm kiếm file đó và trả về cho trình duyệt ở máy khách.

Nếu đó là các file chứa các đoạn mã script thực thi phía máy chủ (các chương trình CGI, hay các file thư viện liên kết động ISAPI, hoặc các file *.asp hay *.php), sẽ triệu gọi chương trình thực thi các đoạn mã này. Chương trình này chạy các đoạn mã, trả chúng về cho Web server dưới khuôn dạng của HTML. Sau đó, Web server mới trả kết quả lấy được cho trình duyệt.

Xử lý các trang PHP

Phân tích chương trình

Chương trình “Hello world” đầu tiên

<HTML>

<BODY>

<?php

echo ("hello, world");

?>

</BODY>

</HTML>

Điều đầu tiên : đoạn mã thực thi PHP luôn luôn được đặt trong thẻ <?php .... ?>. Phía máy chủ sẽ chỉ thực thi các đoạn mã nằm trong thẻ này. Tất cả các đoạn mã khác nằm ngoài thẻ trên đều không được xử lý trực tiếp trên server mà được đưa về trình duyệt.

<?php

// Đoạn mã PHP đặt ở đây

?>

Điều thứ 2 : chương trình phải được đặt trong các file *.php. Web server là chỉ triệu gọi các chương trình xử lý tương ứng với các file có đuôi xác định trước (*.PHP)

Điều thứ 3 :Trong file *.php , ngoài các đoạn script

PHP, bạn có thể đặt bất kỳ cái gì theo khuôn dạng

HTML, kể cả các đoạn JavaScript chạy trên máy

khách. Tức là ngoại trừ các đoạn script PHP ra thì nó

không khác gì một file HTML thông thường

Điều thứ 4 : Có thể đặt nhiều đoạn mã xử lý PHP

khác nhau trong cùng một file PHP. Các đoạn mã

PHP này sẽ được thực thi lần lượt từ đầu file xuống

dưới. Hãy xem ví dụ sau:

<HTML>

<BODY>

<?php

echo ("hello, world");

?>

<BR>

Xin chao tat ca cac ban, day la chuong trinh PHP dau tien cua toi

<?php

echo ("<p align=right> CHAO CAC BAN </p>")

?>

</BODY>

</HTML>

Cuối cùng: Kết thúc mỗi câu lệnh của PHP đều là một dấu chấm phẩy (";"), ngoại trừ một vài trường hợp (ta sẽ được biết sau này)

Cách sử dụng hàm duy nhất trong bài này: echo()

Hàm echo được sử dụng để trả về nội dung của các biến, hằng, chuỗi... cho trình duyệt. Ở ví dụ trên, hàm echo trả về chuỗi "hello, world" và chuỗi "<p align=right> CHAO CAC BAN </p>". Các thẻ HTML trong chuỗi sẽ được giữ nguyên khi nó được đưa về trình duyệt, và nó sẽ được xử lý như các thẻ HTML khác.

Một số lưu ý

Dấu chú thích:

Chúng ta có thể sử dụng một số dấu chú thích sau trong PHP:

// dòng văn bản chú thích (chỉ áp dụng trên một dòng)

/* Đoạn văn bản chú thích */ (nằm trong cặp /* và */

Lưu ý rằng các dấu chú thích này chỉ có hiệu lực trong các

đoạn mã nhúng PHP

Ký tự giải phóng Hãy chú ý đến dòng chữ sau: My name's “ten" Để in nó ra màn hình, ta sẽ làm như sau: <?php echo ("My name's “ten""); ?> Rất tiếc là sai. PHP có quy định một số ký tự đặc biệt (Dấu ngoặc kép

(") là một trong các ký tự đó). Một vài phiên bản của web server khi gặp lỗi này đã không thực hiện nữa, , nó sẽ tự động chèn một dấu (\) trước ký tự gây lỗi này. Ký tự này (\) được gọi là ký tự giải phóng (Escaping character).

Đoạn mã đúng như sau: <?php echo ("My name's: \“ten\""); ?>

Một số các ký tự đặc biệt mà có thể được chỉ rõ với ký tự giải phóng gạch chéo \\

Ký tự Nối tiếp Nghĩa

\' Dấu móc lửng (')

\" Dấu móc kép (")

\\ Dấu gạch chéo (\)

\$ Dấu $

\n Ký tự tạo dòng mới

\r Ký tự về đầu dòng

\t Ký tự Tab

Hãy xem ví dụ dưới đây

<?php

$name=“HoTen";

echo("Giá trị của biến \$name là $name”);

?>

Hằng và biến

PHP quy định bất kỳ từ nào có dấu $ ở trước đều là tên của biến. Ví dụ:

$ten : xác định một biến có tên là ten

$custome_name: xác định một biến có tên là custome_name

Tên biến là chuỗi các ký tự chỉ bao gồm các chữ số, chữ cái (a..z) và dấu gạch dưới ( _ ). Phân biệt các biến chữ hoa và chữ thường . Tên biến không bắt đầu bằng các chữ số (0.. 9)

Gán giá trị cho các biến:

$tên_biến = giá trị cần gán;

Ví dụ:

$nam_sinh=1980;

$ho_ten="Ten";

Các kiểu dữ liệu trong PHP

Có 3 kiểu dữ liệu cơ bản: Integer, double và string. Ngoài ra còn một số kiểu dữ liệu khác như array,object.

Kiểu giá trị Integer sử dụng 4 byte của bộ nhớ. Đây là kiểu giá trị nguyên (không phải là số thực) và có giá trị nằm trong khoảng từ -2 tỷ đến 2 tỷ.

Kiểu dữ liệu double là kiểu dữ liệu số thực (8byte), cho phép chứa các số thưc.

Kiểu String được sử dụng để chứa các dữ liệu như là các ký tự văn bản, ký tự đặc biệt và các chữ số. Dữ liệu kiểu string được đặt trong cặp dấu ngoặc kép ("") (hay còn gọi là chuỗi ký tự).

Ví dụ:

2: Kiểu integer;

2.0: kiểu double

"2": Kiểu xâu

"2 gio": Kiểu xâu

Định nghĩa hằng

Hàm define() được sử dụng để tạo một hằng số:

Cấu trúc :

define ("tên_hằng","giá trị của hằng");

Ví dụ:

define ("LOP_T07A","SSV=45");/* Định nghĩa hằng LOP_T07A với giá trị là "SSV=45“ */

define ("diem_so",9.5);/* định nghĩa hằng diem_so với giá trị là 9.5 ;*/

Lay giá trị của hang:

echo ("Tên lop: ".LOP_T07A);

Điều này tương đương với

echo ("Tên lop: LOP_T07A");

<?php

define("YELOW","#ffff00");

define("WHITE","#ffffff");

define("SISO",45);

if(defined("YELOW"))

{

echo ("<BODY BGCOLOR=".YELOW.">\n");

echo ("SI_SO=".SISO."\n");

}

?>

Ví dụ

Một số hằng xây dựng sẵn (built in constant)

PHP có chứa một số hằng được xây dựng sẵn. TRUE và FALSE là 2 hằng đã được dựng sẵn với chỉ định true (1) false (0) và / hoặc một xâu rỗng)

PHP_VERSION chỉ định phiên bản của bộ phân tích PHP mà bạn đang dùng hiện tại.

PHP_OS chỉ hệ điều hành mà trình phân tích PHP đang chạy.

echo (PHP_OS); // in ra màn hình "Linux"

_FILE_and_LINE_ trả về tên của đoạn script (đoạn mã nhúng) đang được phân tích tại dòng hiện thời trong đoạn mã script.

PHP còn cung cấp một số hàm để thông báo lỗi như E_ERROR, E_WARNING, E_PARSE và E_NOTICE.

Để xem các thông tin về môi trường PHP đang sử dụng , dùng

hàm phpinfo():

<HTML>

<!-- phpinfo.php-->

<BODY>

<?php

phpinfo();

?>

</BODY>

</HTML

Lừa kiểu và ép kiểu dữ liệu

Kiểu dữ liệu của biến sẽ được tự động xác định bởi giá trị đặt vào biến

$a=1 // $a là kiểu integer

$a=1.2 // Bây giờ, nó là kiểu double

$a="1" // Và bây giờ nó là kiểu string

Chuyển kiểu chuỗi phải tuân theo 2 nguyên tắc sau:

- Chỉ những chuỗi bắt đầu là một xâu các chữ số. Nếu chuỗi bắt đầu bằng một giá trị số hợp lệ, chuỗi này sẽ được xác định như giá trị của nó, trong trường hợp khác, nó sẽ trả về 0.

VD: chuỗi "35 tuổi" sẽ được ước lượng là 35, nhưng chuỗi "tuổi 35" sẽ chỉ xác định giá trị 0.

- Một chuỗi chỉ được xác định như kiểu double nếu giá trị kiểu

double được miêu tả bao gồm toàn bộ chuỗi. Chuỗi "3.4", "-

4.2" sẽ được ước lượng như giá trị thực 3.4 và -4.2. Nếu không

phải là ký tự kiểu số thực được đưa vào chuỗi, giá trị của chuỗi

đó sẽ được ước lượng như là một số nguyên. Chuỗi "3.4 dollar"

sẽ thành số nguyên 3.

PHP sẽ thực hiện "lừa kiểu" giữa 2 kiểu số. Khi thực hiện một

phép toán số học giữa kiểu thực và kiểu nguyên, kết quả sẽ là số

thực

$a=1 //$a là một số nguyên

$b= 1.0 //$b là số thực

$c=$a+$b //$c là kiểu số thực , = 2.0

$d = $c+"6th“ //$d là kiểu số thực = 8.0

Ép kiểu dữ liệu

Ép kiểu dữ liệu cho phép thay đổi kiểu dữ liệu của biến

$a=11.2 // $a là kiểu thực

$a=(int)$a // $ a là kieu int,giá trị = 11

$a= (double)$a // $a trở về kiểu thực = 11.0

$b= (string)$a// $b là giá trị kiểu chuỗi ="11"

Ngoài ra, chúng ta còn được phép ép kiểu (array) và (object)

( integer) tương đương với (int);

(fload) và (real) tương đương với (double)

Một số hàm tiện ích khác

PHP có một số hàm hỗ trợ làm việc với các biến

gettype($ten_bien) trả về giá trị là kiểu của biến. "integer","double","string","array","object","class","unknown type"

Ví dụ:

echo(gettype($name));

settype($ten_bien,"kieu_du_lieu") đặt kiểu dữ liệu cho biến $ten_bien.Có thể có một trong các kiểu sau: "integer","double","string","array","object" Kiểu dữ liệu không được đặt, giá trị false sẽ được trả về, nếu thành công, trả về giá trị true.

$a=7.5; //$a là kiểu thực

settype($a,"integer"); // bây giờ nó là một số nguyên có giá trị 7

Hàm isset($ten_bien) xác định xem biến $ten_bien đã đặt một giá trị nào đó hay chưa. Nếu biến đó đã có giá trị, hàm trả về true. Trong truờng hợp ngược lại, hàm trả về giá trị false;

Hàm unset($ten_bien) được sử dụng để huỷ bỏ biến $ten_bien, giải phóng bộ nhớ bị chiếm dụng của biến đó

Ví dụ

$id=“12345”;

if isset($id)

{echo (“Du lieu da được gán”);}

else {echo (“Dư lieu chưa đươc gán”);}

unset($id);

if (!isset($id))

{echo (“Dũ liệu chưa được nạp”); }

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

Để lập trình giải một bài toán nào đó, chúng ta phải sử dụng các câu lệnh sau: a. Lệnh gán: được sử dụng để đặt một giá trị vào một biến nào đó. b. Lệnh rẽ nhánh: Được sử dụng để xác định xem chương trình sẽ thực hiện công việc gì trong điều kiện ra sao c. Lệnh lặp: Cho phép chương trình của bạn tự động lặp lại các thao tác nào đó Quá trình xây dựng các bước để thực hiện một bài toán nào đó, gọi là quá trình xây dựng thuật giải.

Lệnh gán

Cú pháp:

$ten_bien = gia_tri;

Ví dụ:

$ngay_sinh="1/4/1980";

$que_quan="Thanh Hoa";

$luong=300000;

Lệnh rẽ nhánh có dạng sau

if (điều kiện) { công việc cần làm }

Ví dụ:

if ($name=“ten") { echo ("Good morning, my boss"); }

Nếu khối lệnh bao gồm duy nhất một dòng lệnh, ta có thể bỏ cặp dấu {} : if ($name=“ten") echo ("Good morning, my boss");

Nhưng nếu nhiều hơn một dòng lệnh, ta phải đưa

chúng vào cặp dấu ngoặc {}:

if ($name==“ten")

{

echo ("Good morning, my boss");

echo ("Have a romantic day!");

}

Điều kiện có thể là đúng, có thể là sai, có thể là tổng hợp của nhiều điều kiện. ví dụ

if ("false" ) echo ("Khong co gi ca"); if (($name==“ten") && ($pass=="test")) echo ($name. "đã nhập đúng password"); Đoạn lệnh trên tương đương với: if ($name==“ten") { if ($pass=="test") echo ($name. "đã nhập đúng password"); }

Câu lệnh rẽ nhánh đầy đủ: Nếu điều kiện kiểm tra trả về false (sai), thực thi một khối mã lệnh khác bằng từ khoá else

Ví dụ: if (($name=="sinh") && ($pass=="test")) { echo ("Good day,”.$name); } else { echo {"Sai mat khau!") } Chú ý đến một ngoại lệ sau: Trước từ khoá else không bao giờ có dấu chấm phẩy (;)

Lệnh rẽ nhiều nhánh:

Với câu lệnh if, PHP cho phép chúng ta rẽ nhiều nhánh thông qua từ khoá elseif: if (dieu_kien1) { doan_lenh_1; } elseif (dieu_kien_2) { doan_lenh_2 } elseif (dieu_kien_3) } // bao nhiêu từ khoá elseif cũng được else { doan_lenh_n }

Để khắc phục thao tác lặp đi lặp lại việc kiểm tra giá trị của biến $thu,. PHP cho phép ta sử dụng câu lệnh switch-case switch ($bien){ case gia_tri 1: doan_lenh_1; break; case gia_tri 2: doan_lenh_2; break; case gia_tri n: doan_lenh_n; break; default: doan_lenh_khac; }

Lệnh điều khiển vòng lặp

Lệnh điều khiển vòng lặp PHP cung cấp hai kiểu vòng lặp: vòng lặp while (lặp kiểm tra điều kiện, cho đến khi điều kiện được thoả mãn) và vòng lặp for (xác định số lần lặp lại)

Vòng lặp while Vòng lặp while là một dạng vòng lặp đơn giản nhất, cấu trúc của nó gần giống như lệnh if: while (điều kiện) { //Khoi cau lenh can lap }

Ví dụ 1: Tính tổng từ 1 đến 5:

<?php

$i=0;

$tong=0;

while ($i<=5)

{

$tong=$tong+$i;

$i+=1;

}

?>

Vòng lặp này giống như vòng lặp while, nhưng thay vì kiểm tra điều kiện vào lúc đầu của đoạn lệnh cần lặp, thì nó lại kiểm tra giá trị điều kiện vào cuối vòng lặp. Điều này có nghĩa là nó luôn luôn thực hiện đoạn lệnh cần lặp ít nhất một lần. Cấu trúc của nó như sau: do { Đoạn (khối) câu lệnh cần lặp } while (điều kiện);

Vòng lặp do...while

<HTML>

<TABLE> <BODY> <?php $i=1; do { ?> <TR><TD> <INPUT type="text"> </TD></TR> <?php $i+=1; }while ($i<=3); ?> </table> </body>

</html>

Ví dụ:

Vòng lặp for

Vòng lặp for, với ý nghĩa đầu tiên là lặp với số lần định trước, có cấu trúc như sau: for ( $biến = giá_trị_đầu; $biến < (hay <=) giá_trị_kết_thúc; tăng_biến_đếm) { // Khối câu lệnh }

Một biến dạng khác của vòng lặp for, gần giống như lệnh rẽ nhánh if và while: for (bieu_thuc_1; bieu_thuc_2; bieu_thuc_3): // Khối câu lệnh endfor;

Các phép toán số học

Các phép toán quan hệ

Các phép toán logic

Ghép hai biến kiểu string

$first =“HO”;

$second=“TEN”;

$fulname=$first.””.$second;

echo ($fulname);

echo ($first.”HO”);

echo (“${first}TEN”

Các phép toán trên bit

AND

&

Kết quả OR

||

Kết quả XOR

^

Kết quả

1&1

1&0

0&1

0&0

1

0

0

0

1||1

1||0

0||1

0||0

1

1

1

0

1^1

1^0

0^1

0^0

0

1

1

0

Phép dịch n vị trí

Dịch trái << n; Dịch phải >>n

Tăng / giảm : $var++ ; ++$var ; $var-- ;--$var

Toán tử sizeof()-Xác định dung lượng bộ nhớ mà

đối tượng chiếm dụng

Biểu thức điều kiện

Biểu thức điều kiện có dạng:

Y = a1?a2:a3

Nếu a1!==0 thì Y=a2

Nếu a1==0 thì Y=a3

Ví dụ :

Tìm max=$a>$b?a:b

Mảng ( Arrray)

Là một danh sách các phần tử có cùng kiểu dữ liệu.Mảng có

thể là mảng một chiều hay nhiều chiều.

Mảng có 2 thành phần là chỉ mục (key) và giá trị. Chỉ mục

có thể là số nguyên hoặc là chuỗi . Khởi tạo mảng:

$arr[key] = value;

$arr[] = value;

$arr=array($key1=>value1,$key2=>value2);

$arr = array(value1, value2);

Mảng một chiều có chỉ mục

Là mảng được quản lý bằng cách sử dụng chỉ số dưới kiểu integer để biểu thị vị trí của giá trị yêu cầu.

Cú pháp: $name[index1];

Ví dụ: một mảng một chiều có thể được tạo ra như sau: $laptop[0]="Dell"; $laptop[1]="IBM"; $laptop[2]="Acer";

Khi thực thi dòng lệnh sau: print $laptop[1]; trình duyệt sẽ hiển thị dòng sau: IBM.

Có thể sử dụng hàm array( ) của PHP để tạo ra một mảng.Ví dụ: $laptop=array("Dell","IBM","Acer");

Lưu ý : Khác với các ngôn ngữ lập trình khác ( nhu Pascal chẳng hạn) , phần tử đầu tiên của mảng có chỉ mục (index) là 0 , không phải 1 . Nhưng khi khai báo mảng , chỉ mục khởi đầu không nhất thiết là 0 .

ví dụ :

$laptop = array("Dell","IBM","Acer");

Để lấy phần tử đầu tiên gọi echo $laptop[0];

Nhưng nếu khai báo $arr[5] = 1;

thì chỉ mục tiếp theo là 6.

$arr[] = 3; // key là 6

Mảng một chiều kết hợp:

Dùng để ánh xạ một mảng thường sử dụng các “từ” hơn là sử dụng các số ( integer), nó giúp ta giảm bớt thời gian và các mã yêu cầu để hiển thị một giá trị cụ thể. Ví dụ: bạn muốn ghi lại tất cả các loại máy tính và các hãng quen thuộc . $computer["laptop"] = "Dell IBM Acer"; $computer["desktop"] = "mekong"; $computer["Ipod"] = "Apple";

Sử dụng hàm array( ) của PHP để tạo ra một mảng loại này, ví dụ như sau: $computer = array( "laptop" => "Dell IBM Acer", "desktop" => "mekong", "Ipod" => "Apple"); Khi truy xuất phần tử mảng : echo $computer["laptop"]; Sẽ xuất ra : Dell IBM Acer

Khi truy xuất”

echo $computer[“desktop"];

Kết quả ??????

Mảng nhiều chiều có chỉ mục:

Giống như mảng một chiều có chỉ mục, ngoại trừ việc nó có thêm một

mảng chỉ mục được dùng để chỉ định một phần tử.

Cú pháp: $name[index1] [index2]..[indexN];

Một mảng hai chiều có chỉ mục được tạo ra như sau:

$position = $chess_board[5][4];

Mảng đa chiều kết hợp: khá hữu ích trong PHP. Giả sử muốn ghi lại cặp

“máy tinh-chủng loại” va cả nhà sản xuất. Có thể thực hiện như sau:

$computer["Dell"] ["Acer"] = "Korea USA Chines";

$laptop["IBM"] ["toshiba"] = "JP taiwan";

$notebook["apple"] ["sony"] = "JP RSA";

Truy xuất mảng

Để truy xuất hay nhập giá trị cho 1 phần tử mảng cụ thể có thể gọi trực tiếp chúng như sau: $arr = $mang[1]; hoặc $arr = $dothi["x"]; Cú pháp : $arr = $tên mảng[chỉ mục]

Để xóa 1 phần tử ra khỏi mảng , ta dùng unset() $arr = array(1,2,3,4); unset($arr[2]); // $arr bay giờ array(1,2,4);

Để đếm các phần tử của mảng , dùng hàm count() $arr = array(1,2,3,4); $so = count($arr); // sẽ bằng bao nhiêu ?

Duyệt các phần tử của mảng (truy xuất hoặc nhập giá trị)

1. Cách thứ nhất , dùng vòng lặp for Code:

<?php $giatri = array(1,2,3,4,5,6,7,8,9,10); for ($i = 0; $i < 10 ; $i ++) echo $giatri[$i]."<br>"; ?>

Để nhập giá trị vào ta cũng làm tương tự Code:

<?php for ($i = 0; $i < 10 ; $i ++) echo $giatri[$i] = $i +1 ;

?>

Cách thứ 2 : Dùng foreach

Cú pháp : foreach (array_expression as $value)

statement foreach (array_expression as $key => $value)

statement

Ví dụ Code:

<?php $giatri = array(1,2,3,4,5,6,7,8,9,10); foreach ($giatri as $value) echo $value."<br>"; ?>

Với foreach để nhập giá trị vào ta phải thêm dấu " &" trước biến $value , (&$value)

Code:

<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) ?>

Để sắp xếp ta có thể dùng các hàm có sẵn của PHP, tiêu biểu là hàm sort()

Code:

<?php $arr = array(5, 3, 6, 4, 2, 1); var_dump($arr); echo "<br/>\n"; sort($arr); var_dump($arr); ?>

Sắp xếp mảng

Các hàm này cũng sẽ làm việc tốt đẹp với các xâu kí tự, tuy

nhiên với 1 mảng có các giá trị

"report1.pdf","report5.pdf","report10.pdf", and

"report15.pdf" thì kết quả thu được sẽ là:

"report1.pdf","report10.pdf","report15.pdf","report5.pdf

"

Đơn giản là vì mã ASCII của "1" nhỏ hơn "5" nên kết quả sẽ ra

như vậy. Để giải quyết vấn đề này, thay vì sort và asort ta sử

dụng natsort hoặc natcasesort. Kết quả thu được sẽ là:

"report1.pdf", "report5.pdf", "report10.pdf",

"report15.pdf"

Sắp xếp mảng nâng cao

Giả sử ta có mảng nhiều chiều sau:

Code:

<?php

$bikes = array();

$bikes["Tourmeister"] = array("name" => "Grande Tour Meister", "engine_cc" => 1100, "price" =>12999);

$bikes["Slasher1000"] = array("name" => "Slasher XYZ 1000", "engine_cc" => 998, "price" => 11450); $bikes["OffRoadster"] = array("name" => "Off-Roadster", "engine_cc" => 550, "price" => "4295"); ?>

Sắp xếp mảng $bikes theo price của mỗi phần tử

<?php function compare_price($in_bike1,$in_bike2) { if ($in_bike1["price"] > $in_bike2["price"]) { return 1; }

elseif ($in_bike1["price"] == $in_bike2["price"])

{ return 0; } else { return -1; } } uasort($bikes, "compare_price"); foreach ($bikes as $bike) {

echo "Bike {$bike['name']} costs \${$bike['price']}<br/>\n";

} ?>

Kết Qủa :

Bike Off-Roadster costs $4295 Bike Slasher XYZ

1000 costs $11450

Bike Grande Tour Meister costs $12999

Sắp xếp ngược lại

Trong các phần trên ta đều thấy sắp xếp tăng dần, vậy để sắp xếp giảm dần thì làm thế nào? Ta có thể sử dụng rsort và arsort thay thế cho sort và asort. Chú ý là không có ursort! Để sắp xếp ngược lại chỉ cần đảo ngược thứ tự trong hàm so sánh

Sắp xếp theo key Để sắp xếp theo key, ta có các hàm ksort, krsort, và uksort. Sắp xếp theo key sẽ luôn giữ nguyên các key vì vậy không có kasort. Các giá trị đi kèm mỗi key cũng sẽ được giữ nguyên

Các hàm khác

a. array_merge

Nhận vào 2 mảng và trả lại 1 mảng trong đó gồm tất cả các giá trị của 2 mảng ban đầu. Các key sẽ được giữ nguyên trừ khi 2 mảng có 1 key là xâu kí tự , giá trị của mảng thứ nhất sẽ bị ghi đè bằng giá trị của key đó ở mảng thứ hai Ở mảng thứ hai nếu trùng các key là số nguyên với mảng thứ nhất, thì các giá trị của mảng thứ hai sẽ nhận 1 key mới (không ghi đè) <?php $ar1 = array('name' => 'Zeke', 10, 100); $ar2 = array('name' => 'Zimbu', 2, 3, 4); $newar = array_merge($ar1, $ar2); print_r($newar); ?>

Kết quả :

Array ([name] => Zimbu => 10

[1] => 100

[2] => 2

[3] => 3

[4] => 4

Array_combine

Nhận vào 2 mảng rồi trả lại 1 mảng, trong đó các key là các

giá trị của mảng thứ nhất, các giá trị là từ mảng thứ hai.

Nếu 2 mảng không có cùng số phần tử sẽ báo lỗi. <?php

$ar1 = array('name', 'age', 'height');

$ar2 = array('Bob', 23, '5\'8"');

$newary = array_combine($ar1, $ar2);

print_r($newary);

?>

Kết quả

Array (

[name] => Bob

[age] => 23

[height] => 5'8"

)

array_intersect Nhận vào 2 mảng rồi trả lại các phần tử cùng có ở 2 mảng. Các key sẽ được giữ nguyên, nếu cùng 1 giá trị mà lại có 2 key khác nhau thì key ở mảng thứ nhất sẽ được sử dụng. Xét ví dụ sau:

<?php $ar1 = array('name' => 'Zeke',10,100); $ar2 = array('eeek' => 'Zeke',2,3,4,10); $newar = array_intersect($ar1,$ar2);

print_r($newar); ?>

Kết quả Array ( [name] => Zeke

=> 10 )

array_search Khi cần tìm 1 giá trị trong mảng .Khong thay “ false”

<?php

$ar1 = array(1,10,100,23,44,562,354); var_dump(array_search(100, $ar1)); var_dump(array_search(3333, $ar1)); ?>

Kết quả:

int(2) bool(false)

Truyền dữ liệu thông qua phương thức GET

Dữ liệu là phần được nhập trực tiếp theo sau địa chỉ URL do trình duyệt gửi lên, được phân biệt với tên file script bằng dấu hỏi chấm (?). Ví dụ : http://www.phpvn.org/topic.php?TOPIC_ID=161 Trình duyệt sẽ gửi theo địa chỉ trên một cặp biến = giá_trị, trong đó biến có tên là TOPIC_ID và giá trị là 161 (TOPIC_ID=161). Chúng ta cũng có thể đưa lên nhiều cặp biến=giá_trị bằng cách phân cách chúng bởi dấu “&”: http://www.phpvn.org/index.php?method=Reply&TOPIC_ID=161&FORUM_ID=20 Với địa chỉ URL trên, chúng ta sẽ gửi lên 3 cặp biến=giá_trị theo phương thức GET : method=Reply, TOPIC_ID=161 và FORUM_ID=20.

Khi trình duyệt gửi các thông tin này lên máy chủ, PHP sẽ tự động sinh ra một mảng có tên là $_GET[] để nắm giữ tất cả các cặp biến và giá trị đó, trong đó, chỉ số của mảng chính là một chuỗi mang tên của tên biến và giá trị của chỉ số đó chính là giá trị của biến do trình duyệt gửi lên. Ví dụ http://www.phpvn.org/post.php?method=Reply&TOPIC_ID=161&FORUM_ID=20 Thì PHP sẽ tự động sinh ra một mảng $_GET có nội dung sau: $_GET["method"] = "Reply" // tương ứng với cặp method=Reply $_GET["TOPIC_ID"] = 161 // tương ứng với cặp TOPIC_ID=161 $_GET["FORUM_ID"] = 20 // tương ứng với cặp FORUM_ID=20

Code: <?

// Hàm isset được sử dụng để kiểm tra xem một biến đã được thiết lập hay chưa if (isset ($_GET["user"])) { if ($_GET["user"]==“name") { echo "Hello, my boss. Good morning!"; } else {

echo "Hello," .$_GET["user"].". Good morning!"; } } else { echo "Hello, guest. How do you do?"; } ?>

Phương thức POST

Post là phần dữ liệu được gửi qua các form HTML có method ="POST" (xin xem lại bài về HTML). Để lấy các biến theo kiểu POST, PHP sẽ dung mảng có tên là $_POST[]. Mảng này có chỉ số chính là tên của các phần tử trong form (các thẻ input, select... có thuộc tính name) và giá trị là nội dung giá trị do người sử dụng nhập vào các phần tử có tên tương ứng. Chẳng hạn với mẫu biểu HTML sau:

<form method="POST"> <p> User Name:<input type="text" name="T1" size="20"> </p> <p>Password: <input type="password" name="T2" size="20"></p> <p>Sex: <select name ="sex"> <option value =1>Male </option> <option value =0>Female </option> </select> </p> <input type="submit" value="Gui di" name="B1"> </form>

Khi người dùng nhập user name (giả sử là Name),

password (giả sử là 123456) và chọn sex là Male,

khi đó, mảng $_POST sẽ có các phần tử sau:

$_POST["T1"] Name

$_POST["T2"] = 123456

$_POST["sex"] = 1

Cookie và cách sử dụng Cookie

Cookies là một phần dữ liệu được lưu trên máy khách. Mỗi khi máy khách gửi một yêu cầu tới máy chủ nào đó, thì nó sẽ gửi phần dữ liệu được lưu trong cookie tương ứng với máy chủ đó. Trong Cookie có một số thông số sau: - Địa chỉ URL mà trình duyệt sẽ gửi cookie tới - Thời gian hết hạn của cookie - Các cặp biến:giá trị được lưu trữ liên tục Người ta thường dùng cookies để lưu trữ các thông tin có liên quan đến nhiều "phiên" làm việc khác nhau. Vi giao thức HTTP là giao thức không lưu trạng thái (Mỗi khi xử lý xong một yêu cầu từ máy khách là nó phủi tay tự ngắt kết nối luôn và chẳng thèm quan tâm đến máy khách làm gì ), nên cookies được sinh ra để làm nhiệm vụ lưu trữ một số biến trạng thái để khắc phục nhược điểm này.

Cách ghi thông tin vào cookie và gửi xuống trình duyệt Sử dụng hàm setcookie() setcookie (string name[,string value [,int expire [,string path [,string domain [,int secure]]]]]) Trong đó: - string name: Chuỗi mang tên của cookie - string value: Chuỗi mang giá trị của cookie tương ứng với tên đã cho - int expire: Thời gian hết hạn của cookie - string path: Đường dẫn của cookie (đến 1 thư mục nào đó trên máy chủ. - string domain: cookie này sẽ được gửi tới domain nào? - int secure: Chế độ bảo mật. Các tham số trong cặp dấu ngoặc vuông là tuỳ chọn

Chú ý: Hàm setcookie phải được gọi trước khi bạn gửi bất kỳ một nội dung nào xuống trình duyệt: VD: Cách dùng đúng:

Code:

// Thực hiện các câu lệnh nào đó, nhưng không được phép gửi gì xuống trình duyệt setcookie ("ten_truy_cap",“my name"); setcookie ("password",“abcd"); // Thực hiện các câu lệnh tiếp theo, có thể xuất dữ liệu xuống trình duyệt: echo "<html><body>Xin chao nguoi ban cua toi";

VD: Cách dùng sai:

Code:

// Thực hiện các câu lệnh nào đó echo ("cái gì đó"); setcookie ("ten_truy_cap",“my name"); setcookie ("password",“abcdef"); // các câu lệnh khác.

Ví dụ trên sai vì bạn đã trót gửi dòng "cái gì đó" xuống trình duyệt trước khi gọi hàm setcookie.

Cách lấy dữ liệu lưu trong cookie: Để lấy dữ liệu đã lưu trong cookies do trình duyệt gửi lên, ta có thể dùng mảng $_COOKIE["tên_cookie"] Chẳng hạn, với câu lệnh setcookie ở trên, sau khi trình duyệt gửi lên, ta sẽ có 2 biến sau: $_COOKIE["ten_truy_cap"] // chứa giá trị “my name" $_COOKIE["password"] // chứa giá trị “abcd".

SỬ DỤNG SQL ĐỂ TRUY VẤN DỮ

LIỆU TRONG PHP

PHẦN 2

SQL là một ngôn ngữ được sử dụng trong các ngôn ngữ lập trình để truy vấn thông tin trong CSDL.Ngôn ngữ này là cấu trúc đơn giản, có thể nhập lệnh vào dưới dạng các chuỗi văn bản, sau đó chuyển câu lệnh tới các chương trình điều khiển trung gian để truy vấn dữ liệu rồi trả về cho chương trình. Như vậy, mọi thao tác kết xuất, truy vấn hoàn tòan dễ dàng thông qua việc điều khiển chuỗi văn bản có chứa câu lệnh SQL.

Ngôn ngữ truy vấn CSDL SQL

Cú pháp:

Code:

INSERT INTO tên_bảng (danh_sách_trường) VALUES (danh_sách_giá_trị)

Trong đó: - Các từ khóa cố định là INSERT, INTO và VALUES. - tên_bảng là tên của một bảng quan hệ trong CSDL. - danh_sách_trường là danh sách các trường trong bảng quan hệ , mỗi trường cách nhau một dấu phảy. - danh_sách_giá_trị là danh sách các giá trị tương ứng với các trường.

Ví dụ :

INSERT INTO NSD (Ten_ND,Tuoi_ND,MatKhau_ND) VALUES(„ten',30,'123456')

Câu lệnh chèn dữ liệu vào một bảng.

Câu lệnh UPDATE với cú pháp:

Code:

UPDATE tên_bảng SET tên_trường1=giá_trị1 [tên_trường_i=giá_trị] WHERE điều_kiện

Ví dụ, đổi mật khẩu của những người có trường Ten_ND là Ten thành “JHWSC” trong bảng trên, ta sẽ làm như sau:

Code:

UPDATE NSD SET Matkhau_ID = „abcd' WHERE Ten_ND=„Ten'

Chỉnh sửa (update) dữ liệu trong bảng

Câu lệnh DELETE với cú pháp:

Code:

DELETE FROM tên_bảng WHERE điều_kiện.

Câu lệnh này sẽ xóa tất cả những bản ghi thỏa mãn điều kiện nằm sau mệnh đề WHERE. VD:

DELETE FROM NSD WHERE Ten_ND=„ten'

Câu lệnh xóa dữ liệu trong bảng

Cú pháp của lệnh này như sau:

SELECT [danh_sách_trường] FROM [danh_sách_bảng]

WHERE [danh_sách_điều_kiện] [ORDER BY]

1.Câu lệnh SELECT

SELECT được dùng để truy xuất dữ liệu từ một bảng. Kết quả trả

về dưới dạng bảng được lưu trong 1 bảng kết quả - result table

(còn được gọi là tập kết quả - result set).

Cú pháp

SELECT tên_các_cột FROM tên_bảng

Vd:

SELECT ten_KH,Nam_sinh FROM DSKH

Truy vấn (tìm kiếm) dữ liệu trong bảng

Mệnh đề WHERE dùng để thiết lập điều kiện truy xuất.

Để truy xuất dữ liệu trong bảng theo các điều kiện nào đó, một

mệnh đề WHERE có thể được thêm vào câu lệnh SELECT.

Cú pháp

SELECT tên_cột FROM tên_bảng WHERE tên_cột phép_toán

giá_trị

vd:

SELECT * FROM DSKH WHERE City = 'Saigon'

Mệnh đề WHERE

Trong mệnh đề WHERE, các phép toán được sử dụng là Phéptoán Mô tả = So sánh bằng <> So sánh không bằng > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng <= Nhỏ hơn hoặc bằng BETWEEN Nằm giữa một khoảng LIKE So sánh mẫu chuỗi

DISTINCT được dùng để lọc ra các giá trị khác nhau. SELECT sẽ trả về thông tin về các cột trong bảng. Nhưng nếu chúng ta không muốn lấy về các giá trị trùng nhau thì sau?Ta chỉ cần thêm từ khoá DISTINCT cú pháp sau: SELECT DISTINCT tên_cột FROM tên_bảng Ví dụ: Tìm tất cả các công ty trong bảng đặt hàng, câu lệnh SQL thông thường sẽ như sau: SELECT Company FROM Orders Để tìm tất cả các công ty có tên khác nhau trong bảng đặt hàng, ta sử dụng câu lệnh SQL sau: SELECT DISTINCT Company FROM Orders

Từ khoá DISTINCT

SỬ DỤNG SQL ĐỂ TRUY VẤN DỮ LIỆU TRONG PHP

Các bước xây dựng chương trình có kết nối tới CSDL My SQL:

Thông thường, trong một ứng dụng có giao tiếp với CSDL, ta phải làm theo bốn trình tự sau: Bước 1: Thiết lập kết nối tới CSDL. Bước 2: Lựa chọn CSDL. Bước 3: Tiến hành các truy vấn SQL, xử lý các kết quả trả về nếu có Bước 4: Đóng kết nối tới CSDL.

Để kết nối tới MySQL, ta sử dụng hàm mysql_connect() Cúpháp:

mysql_connect(host_name,tên_truy_cập,mật_khẩu); hostname là tên (hoặc địa chỉ IP) của máy chủ cài đặt MySQL. tên_truy_cập là tên truy cập hợp lệ của CSDL cần kết nối mật_khẩu là mật khẩu tương ứng với tên truy cập Ví dụ: <? mysql_connect ("localhost","my_name","root") or die “Mysql is not connected”; ?>

Thiết lập kêt nối tới MySQL

Ta có thể dùng hàm if để kiểm tra xem có kết nối được tới MySQL hay không: <?php $link=mysql_connect("localhost","mysql_user", "mysql_password"); if (!$link) { echo "Không thể kết nối được tới CSDL MySQL"; } ?>

Để lựa chọn một CSDL với tên là tên_truy_cập" ta dùng hàm mysql_select_db (tên_CSDL);

Dùng sau khi thiết lập kết nối bằng hàm mysql_connect. Trả về true nếu thành công, false nếu thất bại. VD: <?php $link = mysql_connect("localhost","mysql_user", "mysql_password"); if (!$link) { echo "Không thể kết nối được tới MySQL"; } if (!mysql_select_db (“DSKH")) { echo "Không thể lựa chọn được CSDL DSKH"; } ?>

Lựa chọn CSDL

Để đóng kết nối tới CSDL, ta dùng hàm mysql_close. Hàm này có nhiệm vụ đóng kết nối tới CSDL có mã định danh được tạo ra bởi hàm mysql_connect(). Cú pháp: mysql_close(mã_định_danh_kết_nối). Ví dụ: <?php $link = mysql_connect("localhost","mysql_user", "mysql_password"); if (!$link) { echo "Không thể kết nối được tới MySQL"; } mysql_close($link); ?>

Đóng kết nối tới CSDL:

Thực hiện các truy vấn thêm, xóa, sửa bản ghi thông qua câu lệnh SQL

Trong phần này ta sử dụng MySQL chạy trên nền máy chủ localhost, người sử dụng có username là mysql_user, mật khẩu là mysql_password.

CSDL có tên là FORUM , trong đó có một table là DSTV để lưu thông tin về những thành viên của diễn đàn.

Bảng DSTV có các trường sau: U_ID: Autonumber.// mã số của người dùng U_Name: Varchar [20] // tên truy cập của người dùng U_Pass: Varchar[64] //mật khẩu của người dùng U_IP: Varchar [15] //Địa chỉ IP của người dùng. U_Post: Number // Số bài viết của người dùng.

a. Thêm một bản ghi vào bảng. Ví dụ : chèn thêm một người sử dụng có U_Name là “TEN", U_Pass là "123456", U_Post=0 <? $sql = "INSERT INTO DSTV (U_Name, U_Pass) VALUES ("TEN","123456",0)”; mysql_query ($sql); ?>

Hoặc:

<?

$sql=”INSERT INTO `Forum`.`DSTV` (`U_ID`, `U_name`, `U_pass`, `U_IP`, `User_post`) VALUES ('', CHAR('TEN'), PASSWORD('123456'), '', '0')”;

mysql_query ($sql); ?>

b.Đếm số dòng dữ liệu trong bảng:

Cú pháp:

mysql_num_rows();

c.Lấy dữ liệu từ bảng đưa vào mảng:

Cú pháp:

mysql_fetch_array();

Vd:

<? if(mysql_num_rows($query) == 0)

{

echo "Chua co du lieu";

}else

{

while($row=mysql_fetch_array($query))

{

echo $row[username] ." ".$row[password]."<br />";

}

}

?>

Xóa một bản ghi khỏi bảng. Trong trường hợp này, ta sử dụng câu lệnh SQL DELETE FROM

VD: Muốn xóa khỏi bảng DSTV tất cả những người có U_Name=“TEN": <? $sql = "DELETE FROM DSTV WHERE U_Name=„TEN'"; mysql_query ($sql); ?>

Sửa thông tin của bản ghi trong bảng.

Sử dụng cú pháp UPDATE:

VD: Cập nhật địa chỉ IP cho người có U_name="ABC" với địa chỉ IP được lấy từ trình duyệt:

<? $sql = "UPDATE DSTV SET U_IP ='" . $_SERVER['REMOTE_ADDR'] . "'Where U_name='ABC'"; mysql_query ($sql); ?>

(Biến $_SERVER['REMOTE_ADDR'] chứa địa chỉ IP của trình duyệt. Xin xem lại ở bài trước)

VD2:

$sql = UPDATE `dskh`.`ds_vip` SET `name` = 'ha' WHERE `ds_vip`.`id` = 3 LIMIT 1;

get_method.php

<?php

//url://localhost/get_method.php?user=ten

//ham isset dung de k/t mot var da duoc thiet lap ?

if (isset($_GET["user"]))

{

if ($_GET["user"]==“ten")

{

echo "Hello , my friend . Good morning";

}

else

{

echo "Hello,". $_GET["user"] . ".Good morning!";

}

}

else

{

echo " Hello , guest .How do you do?";

}

?>