Shell script


1. Các biến số và sử dụng các biến:
Có 3 loại biến:
- Biến môi trường toàn cục: printenv
- Biến môi trường cục bộ: set
- Biến người dùng định nghĩa
Tự định nghĩa biến:
- Lệnh set thực ra là thiết lập biến có dạng:
set <Tên biến>=<Giá trị>
Gỡ bỏ <tên biến> : unset <tên biến>
Nếu không có tên biến theo sau thì set sẽ liệt kê tất cả các biến, kể cả các biến tạm mà ta đã đặt ở trên.
Sau khi logout, reboot, các biến ta tự thiết đặt bằng lệnh set cũng mất đi.
- Có thể gán biến bằng cách <tên biến>=<giá trị>
- Trong shell script, gán biến bằng cách: $<tên biến>=<giá trị> (không có khoảng trắng ở 2 bên dấu bằng)
Nguyên tắc đặc tên biến
- Chỉ cho phép chữ, số, dấu _, bắt đầu bằng chữ cái, hoặc _, không dùng khoảng trắng, các ký tự đặc biệt,
- Phân biệt HOA thường,
- Biến NULL: $abc= hoặc $abc=""
In ra biến
- $<tên biến>
- echo $<tên biến>
Chú ý
Nếu            echo $HOME                         in ra /home/u1
thì               echo "$HOME/abc"               in ra /home/u1/abc
Nhưng       echo "$HOME_abc"             in ra rỗng                    vì không có biến $HOME_abc
Lý do ở cơ chế nhận dạng biến, khi gặp bất cứ ký tự nào không hợp lệ so với quy định đặt tên biến (chữ, số, dấu _) thì nó tự hiểu đoạn từ $ tới ký tự đó là tên biến.
Ở vd trên dòng 2, nó tự hiểu tên biến là HOME (kết thúc trước dấu /)
    ở dòng 3, tên biến là HOME_abc.
Dòng 3 sửa lại: echo "${HOME}_abc"
2. Cơ bản:
Hiển thị / In ra màn hình:
echo [tùy chọn] <thông báo>
[tùy chọn]    có thể là -n: in xong, không xuống dòng,
                                     -e: cho phép thực thi các ký tự đặc biệt như:
                                                  \t   \n  :  tab, xuống dòng
                                                  `<lệnh>`  :  thực hiện lệnh
VD: echo -e "Hom nay ngày `date +%d` \n thang `date +%m` \n nam `date +%Y`"
Đọc dữ liệu:
read [tùy chọn] <biến>
Đọc giá trị từ bàn phím rồi gán cho biến.
[tùy chọn]    có thể là -n<số>: chỉ tiếp nhận <số> ký tự,
                                     -p: hiện lời nhắc theo kiểu prompt
Sử dụng tham số dòng lệnh
- Các đối số cách nhau bởi 1 khoảng trắng,
- Lệnh và các đối số được gán cho các biến lần lượt:
       Lệnh:   $0
       Đối số thứ 1:   $1
       ...
       Đối số thứ 9:   $9
Phép so sánh
-eq : =
-ge : >=
-gt : >
-le : <=
-lt : <
-ne : !=
Phép gán:
Lệnh expr:
expr a + b    (tương đương tong=$[ $a + $b ])
expr a - b
expr a \* b
expr a / b
expr a % b
Phép so sánh chuỗi
string1 = string2
string1 < string2
string1 > string2
string1 != string2
-z string : trả về true nếu string là rỗng
-n string: trả về true nếu string khác rỗng
Phép Kiểm tra file, thư mục
-d <file> : trả về TRUE nếu file là thư mục
-e <file> : trả về TRUE nếu file tồn tại
-f <file> : trả về TRUE nếu file là tập tin
-s <file> : trả về TRUE nếu file khác rỗng
-r <file> : trả về TRUE nếu file chỉ đọc
-w <file> : trả về TRUE nếu file được phép ghi
-x <file> : trả về TRUE nếu file được phép thực thi
Tham khảo thêm tại http://www.comptechdoc.org/os/linux/usersguide/linux_ugshellpro.html

3. Cấu trúc, phát biểu trong Shell
Phát biểu if
Dạng tổng quát
if <điều kiện>
then
        <lệnh>
elif <điều kiện>
then
        <lệnh>
else <điều kiện>
        <lệnh>
fi
Các đoạn elif , else có thể không có, như các ngôn ngữ lập trình.
Vòng lặp while
while <điều kiện>
do
         <lệnh>
done
Vòng lặp for
for <biến> in <Danh sách>
do
          <lệnh>
done
ví dụ:
read -p "Nhap file chua user can tao" file.txt
for x in `cat $file`
do
      useradd x
      echo "123456" | passwd $x --stdin
done
màn hình in ra:
1
3
5
Dạng khác:
for (( điều kiện ))
do
       <lệnh>
done
ví dụ:
for (( i=1; i <= $n; i++ ))
do
       echo "*"
done

Nhận xét