Kiểm tra điều kiện trên tập tin
So sánh chuỗi
true nếu string1 rỗng (null) -z string1
true nếu string1 không rỗng -n string1
true nếu 2 chuỗi không bằng nhau
string1 != string2
true nếu 2 chuỗi bằng nhau string1 = string2
Kết quả So sánh
So sánh toán học
true nếu exp1 < exp2 exp1 -lt exp2
true nếu exp1 >= exp2 exp1 -ge exp2
true nếu exp1 > exp2 exp1 -gt exp2
true nếu 2 biểu thức không bằng nhau
exp1 -ne exp2
true nếu 2 biểu thức bằng nhau exp1 -eq exp2
Kết quả So sánh
phuongnh@it-hut.edu.vn 31 So sánh toán học
true nếu exp là false !exp
true nếu exp1 <= exp2 exp1 -le exp2
Kết quả So sánh
phuongnh@it-hut.edu.vn 32 Kiểm tra điều kiện trên tập tin
true nếu file cho phép đọc -r file
true nếu set-group-id được thiết lập trên file
-g file
true nếu file là tập tin thường -f file
true nếu file tồn tại trên đĩa -e file true nếu file là thư mục -d file Kết quả So sánh phuongnh@it-hut.edu.vn 33 Kiểm tra điều kiện trên tập tin
true nếu file được phép thực thi -x file
true nếu file cho phép ghi -w file
true nếu set-user-id được thiết lập trên file
-u file
true nếu kích thước file khác 0 -s file Kết quả So sánh phuongnh@it-hut.edu.vn 34 3.3. Cấu trúc điều khiển Giống với ngôn ngữkhác if elif case for while until Lệnh if Cú pháp: if <điều kiện> then <các câu lệnh> else <các câu lệnh> fi
Ví dụ: file if_test.sh sau đây tùy vào câu trảlời của user mà đưa ra văn bản thích hợp
Lệnh if
#!/bin/sh
echo "Co phai buoi sang?" read timeofday
if [ $timeofday="yes" ]; then echo "Chao buoi sang" else
echo "Chao buoi chieu" fi
phuongnh@it-hut.edu.vn 37 Lệnh if
Kết quả $./if_test.sh Co phai buoi sang? yes
Chao buoi sang
phuongnh@it-hut.edu.vn 38 Lệnh elif
Nếu chúng ta nhập liệu khác yes thì đoạn mã trên sẽcoi là no.
Sửa đổi lại chương trình trên: #!/bin/sh
echo "Co phai buoi sang?" read timeofday
if [ $timeofday="yes" ]; then echo "Chao buoi sang" elif [ $timeofday="no" ]; then
echo "Chao buoi chieu
else
echo "Khong biet" exit 1
fi exit 0
phuongnh@it-hut.edu.vn 39 Vấn đề phát sinh với các biến
Với ví dụ elif trên đây, nếu ta nhấn Enter luôn mà không nhập vào cái gì thì sẽnhận được thông báo:
[: =:unary operator expected]
Lý do: lỗi phát sinh ngay mệnh đề if đầu tiên, biến timeofday rỗng và shell diễn dịch thành if [ ="yes" ] và shell không hiểu bạn so sánh "yes" với cái gì.
Đểtránh lỗi này, ta bọc biến trong nháy kép "$timeofday"
phuongnh@it-hut.edu.vn 40 Cải tiến ví dụ trên
#!/bin/sh
echo "Co phai buoi sang?" read timeofday
if [ "$timeofday"="yes" ]; then echo "Chao buoi sang" elif [ "$timeofday"="no" ]; then
echo "Chao buoi chieu"
else
echo "Khong biet" exit 1 fi exit 0 Lệnh case Cú pháp: case biến in mẫu[|mẫu]...) các lệnh;; mẫu[|mẫu]...) các lệnh;; ... esac Chú ý đặt 2 dấu chấm phẩy sau mỗi lệnh so khớp File case1.sh #!/bin/sh
echo "Co phai buoi sang?" read timeofday
case "$timeofday" in
"yes") echo "Chao buoi sang";; "no") echo "Chao buoi chieu";; "y") echo "Chao buoi sang";; "n") echo "Chao buoi chieu";; *) echo "Khong biet gi het tron";; esac
phuongnh@it-hut.edu.vn 43 File case2.sh
#!/bin/sh
echo "Co phai buoi sang?" read timeofday
case "$timeofday" in
"yes"|"y"|"Yes"|"YES") echo "Chao buoi sang";; "n*"|"N*") echo "Chao buoi chieu";;
*) echo "Khong biet gi het tron";; esac
exit 0
phuongnh@it-hut.edu.vn 44 File case3.sh
#!/bin/sh
echo "Co phai buoi sang?" read timeofday
case "$timeofday" in
"yes"|"y"|"Yes"|"YES") echo "Chao buoi sang";; "[nN]*") echo "Chao buoi chieu";;
*) echo "Khong biet gi het tron" exit 1 ;; esac exit 0 phuongnh@it-hut.edu.vn 45 Lệnh for Lệnh lặp một sốlần với các giá trịxác định Cú pháp: for biến in các_giá_trị do các_lệnh done phuongnh@it-hut.edu.vn 46 Lệnh for - file forloop1.sh
#!/bin/sh
for foo in bar fud 12 do echo $foo done exit 0 Kết quả: $./forloop1.sh bar fud 12
Lệnh for - file forloop2.sh
#!/bin/sh for file in $(ls f*.sh); do lpr $file done Đoạn mã trên in ra tất cảcác file .sh có tên bắt đầu bằng ký tự f Đoạn mã trên có sử dụng $(command), lát nữa chúng ta sẽhọc vềcú pháp này Lệnh while
Cho phép lặp khi điều kiện kiểm tra vẫn còn đúng.
Cú pháp:
while <điều kiện> do <các câu lệnh> done
phuongnh@it-hut.edu.vn 49 Lệnh while - file password.sh
#!/bin/sh
echo "Nhap vao mat khau" read passwd
while [ "$passwd" != "hahaha" ]; do echo "Xin moi nhap lai"
read passwd done
exit 0
phuongnh@it-hut.edu.vn 50 Lệnh while - file whilefor.sh
#!/bin/sh foo=1
while [ "$foo" -le 20 ] do
echo "Lan thu $foo" foo=$(($foo + 1)) done exit 0 phuongnh@it-hut.edu.vn 51 Lệnh until Cú pháp: until <điều kiện> do <các câu lệnh> done Vòng lặp dừng nếu điều kiện là đúng phuongnh@it-hut.edu.vn 52 Lệnh until - file until_user.sh
#!/bin/sh
echo "Dang tim user"
until who|grep "$1">/dev/null do
sleep 60 done
#Chuong thong bao echo -e \\a
#Hien thi ten user da login
echo "***$1 vua dang nhap vao he thong***" exit 0 Lệnh who cho danh sách các user đăng nhập vào hệthống Lệnh grep lọc ra tên các user theo
biến môi trường $1 Lệnh until Ta dùng 2 màn hình console ảo (trong chếđộ văn bản, nhán Alt+F1, Alt+F2) hoặc mở2 terminal trong chếđộđồhọa Chạy từ1 màn hình: $./until_user.sh phuong Dang tim user
Nó sẽchờđến khi user tên là phuong đăng nhập vào từmàn hình thứ 2. ***phuong vua dang nhap vao he thong***