Bài tập thực hành 1 - Shell script
bài tập
Preview text:
Bài 1. Chương trình tính tổng 1-> n
– Minh họa các cấu trúc while do done, và cách dùng [], $(()). – Tập tin tong1.sh #!/bin/sh
echo “Chuong trinh tinh tong 1- $1” index=0 tong=0
while [ $index -lt $1 ] do
index=$(($index + 1))
tong=$(($tong + $index)) done echo “Tong 1-$1= $tong” exit 0
– Chạy chương trình :
chmod a+x tong1.sh ./tong1 100
===============================================================
================================
Bài 2. Chương trình tính giai thừa của một số
– Minh họa các cấu trúc while do done, và phương pháp dùng [], $(()). – Tập tin giaithua.sh #!/bin/sh
echo “Chuong trinh tinh $1!” index=0 gt=1 while [ $index -lt $1 ] do index=$(($index + 1)) gt=$(($gt * $index)) done echo “$1!= $gt” exit 0 – Chạy chương trình : chmod a+x giaithua.sh ./giaithua 5
=============================================================== =========================
Bài 3. Chương trình đếm số dòng của một tập tin
– Minh họa các cấu trúc if then fi, while do done, và hướng dẫn sử dụng [], $(()). – Tập tin demdong.sh #!/bin/sh
echo “Chuong trinh dem so dong cua tap tin $1” n=0 while read line – 22- do n=$(($n + 1)) done
echo “So dong cua tap tin $1 la : $n” exit 0 – Chạy chương trình : chmod a+x demdong.sh ./demdong bai1.txt
Bài 4. Chương trình đếm số từ của một tập tin
– Minh họa các cấu trúc for do done, while do done. – Tập tin demtu.sh #!/bin/sh
echo “Chuong trinh dem so tu cua tap tin $1” n=0 while read line do for wd in $line do n=$(($n + 1)) done done
echo “Tong so tu cua tap tin $1 la : $n” exit 0 – Chạy chương trình : chmod a+x demtu.sh ./demtu bai1.txt
=============================================================== ============================
Bài 5. Chương trình tìm định dạng có độ dài to nhất trong một tập tin
– Minh họa các cấu trúc if then fi, while do done. – Tập tin dongmax.sh #!/bin/sh
echo “Chuong trinh tim dong dai nhat trong tap tin $1” n=0 max=0 dong=”” while read line do n=`expr length “$line”` if [ $n –gt $max ] then dong=”$line” max=$n fi done
echo “Dong trong tap tin $1 co do dai max = $max la : $dong” exit 0 – Chạy chương trình : chmod a+x dongmax.sh ./dongmax bai1.txt
Bài 6. Chương trình tìm một xâu trong một tập tin
– Minh họa các cấu trúc if then fi, while do done. – Tập tin timxau.sh #!/bin/sh
echo “Chuong trinh tim xau $1 trong tap tin $2”
wordlen=`expr length “$1”` # Do dai tu can tim while read textline do
textlen=`expr length “$textline”` # Do dai cua dong vua doc
end=$(($textlen – wordlen + 1” index=1 while [ $index –le $end ] do
temp=`expr substr “$textline” $index $wordlen if [ “$temp” = $1 ] then
echo “Tim thay $1 tai dong $textline” break fi index=$(($index + 1)) done done exit 0 – Chạy chương trình : chmod a+x timxau.sh ./timxau abc bai1.txt
– Tìm số lớn nhất trong dãy số nhập vào #/bin/bash # input an array of elements function input() echo -n “n= ” read n for ((i=0; i do echo -n “a[$i] ” = read a[$i] done #max of two numbers function max2nums()
if [ “$1” -gt “$2” ]; then max1=$1 echo $1 else max1=$2 echo $2 fi return $max1 #max of an array function maxs() max=$a[0] for ((i=1; i do max=$(max2nums $a[$i] $max) done echo “max = $max” input maxs exit $?
=============================================================== ==========================
Bài 7: Viết 1 chương trình Shell đọc từng loại trong 1 file văn bản. Giữa mỗi lần
hiển thị dòng text thì có 1 câu hỏi từ Shell: “bạn có mong muốn đọc dạng tiếp
theo không ? Y/n” nếu trả lời là “y” hoặc
“Y” thì in thể loại tiếp theo, trong trường hợp ngược lại thì chấm dứt chương trình đọc. Code: #!/bin/sh
echo – e “ nhap ten file:” read filename
if [ ! –F “$filename” ]; then
echo “ $filename not exists” exit 1 fi answer=”” count=0
numlines=`wc –l $filename|sed ‘s/^ *//’|cut –d “ “ –f 1`
echo “ so dong: $numlines”
while [ “$answer”!=”n”] do
echo –e “tiep tuc(y/n)?” read answer
if [ “answer” = “y” ]; then echo “doc het file rui” exit 0 fi count=$(($count+1)) sed –n $countp $filename done exit 0
=============================================================== =============================
Bài 8: Viết 1 định dạng lệnh cho phép đọc 3 loại trước tiên trong 1 file văn bản
mà k được dùng bất cứ vòng lặp nào Code: sed –n 1,3p $filename
=============================================================== ==========================
Bài 9: Viết 1 chương trình trong Shell sao cho với tham số thứ nhất là tên file text và
nó sẽ in ra màn hình content file này, nhưng với all ký tự đều viết hoa Code: #!/bin/sh
echo – e “ nhap ten file:” read filename
if [ ! –F “$filename” ]; then
echo “ $filename not exists” exit 1 fi
echo “file sau khi chuyen doi:”
tr ‘[a-z]’ ‘[A-Z]’ exit 0
=============================================================== ============================
Bài 10: Viết 1 chương trình Shell chỉnh sửa văn bản sao cho nếu trên 1 loại mà có nhiều
hơn 2 khoảng trắng liền nhau thì được thay thế bằng 1 khoảng trắng Code:
tr –s ‘ ‘ ‘ ‘ $filename
Bài 1: Viết chương trình Shell liệt kê các tham số truyền vào chương trình theo từng dạng với cú
pháp: “day la tham so thu N va co ten la NNNN” bằng các cách sau: • dùng vòng lặp FOR.
• dùng vòng WHILE và lệnh SHIFT
• dùng vòng WHILE và không sử dụng lệnh SHIFT. Code: #!/bin/sh #while + SHIFT: count=0 while [ “$#” –ne 0 ] do
echo “day la tham so thu $count: $1” count=$(($count + 1)) shift done #WHILE without SHIFT: count=1 total=$(($#+1)) while [ “$*” –ge 0 ] do
echo –n “day la tham so thu $count: ” eval echo \$$count count=$(($count+1)) done #for: count=1 for arg in “$*” do
echo “day la tham so thu $count: $arg” count=$(($count + 1)) done
===============================================================
================================
Bài 11: Viết chương trình Shell đánh giá các tham số và các đối số truyền vào tương
ứng với tham số đó. Giả sử chương trình myshell đủ sức nhận 4 tham số là a,b,c,d
nhưng chỉ có tham số c là có đối số truyền vào. Khi gõ câu lệnh trong Shell: myshell –
abc argument –d other_argument thì với tham số c ta có đối số là argument, ngoài ra
chương trình còn 1 đối số là other_argument. Code: while getopts abc:d option do case “$option” in a) echo “co tham so a”;; b) echo “co tham so b”;;
c) echo “co tham so c, doi so la $OPTARG”;; d) echo “co tham so d”;;
\?)echo “ tham so nay khong hop le” esac done
while [ “$OPTIND” –le “$#” ] do
echo –n “tham so tu do: “ eval echo \$$OPTIND shift done
=============================================================== ==================
Bài 12 : Viêt́ chương triǹ h shell giaỉ phương triǹ h bâc ̣hai : ax2 + bx +c =0 với các
tham số a,b,c nhập từ bàn phiḿ va ̀ cać kêt́ qua ̉ chiń h xać đêń hai chữ số. Code: #!/bin/bash echo -n “a= ” read a echo -n “b= ” read b echo -n “c= ” read c
delta=$(echo “$b^2 – 4*$a*$c” | bc) if [ $delta -lt 0 ] then echo “pt vo nghiem” elif [ “$delta” -eq 0 ] then
echo -n “pt co nghiem kep x= ”
x=$(echo “scale=2; -$b/(2*$a)” | bc) echo “$x” else
echo “phuong trinh co 2 nghiem”
x1=$(echo “scale=2; -($b + sqrt($delta))/(2*$a)” | bc) echo “x1= $x1”
x2=$(echo “scale=2; -($b – sqrt($delta))/(2*$a)” | bc) echo “x2= $x2” fi exit 0
Bài 13 :Viêt́ chương triǹ h shell liêṭ kê cać tâp ̣ tin trong thư muc ̣nhâp ̣vaò tư ̀ baǹ
phím ma ̀ co ́ kić h thước > 4KB theo dạng sau : Tổng số tâp ̣ tin
Tập tin 1 click thước …..
tập in n kích thước Code: #!/bin/bash SIZE=4096 # hằng số echo -n “thu muc : ” read directory index=0
for file in $( tìm kiếm $directory -type f) do
filesize=$(ls -l $file | awk ‘print $5‘) # trươǹ g thư ́ 5 cuả kêt́ qua ̉ lêṇ h ls –l la ̀ kić h
if [ $filesize -gt $SIZE ] # thước file then
_filename[$index]=$file # gán man̉ g file name
_filesize[$index]=$filesize # gán man̉ g file size let “index +=1” fi done
echo “Tong so tap tin : $index” for ((i=0 ; i do
echo -e “`basename $_filename`\t\t kich thuoc: $_filesize” done exit 0
===================================================== =========================
Bài 14 :
Viêt́ chương triǹ h shell đoc ̣môṭ danh saćh cać người dùng từ tập tin users
rồi test nhìn thấy các người dùng này có thuộc nhóm W3 hay không? Nêú co ́ user naò
thuôc ̣nhóm thi ̀ xoá user đo ́ ra khoỉ group W3 ngươc ̣lại thi ̀ thêm người dùng đo ́ vaò group. Code: #!/bin/bash FGROUP=/etc/group GROUPNAME=W3 UFILE=users
if [ ! -E $UFILE ]; then
echo “File users does not exist” exit 1 fi
all_users=( $(cat $FGROUP | grep -w $GROUPNAME | cut -d: -f4 | tr , ” “) )
# all_users=( $(cat $FGROUP | awk –F: ‘/$GROUPNAME/ print $4’ | tr , ” “) ) num_usr_grp=$#all_users[@] add_remove_users() local co=0
for (( i=0; i< num_usr_grp; i++ )) do
if [ “$1” == “$all_users” ] then co=1;break fi done
if [ $co -eq 1 ]; then
gpasswd -d $1 $GROUPNAME else
gpasswd -a $1 $GROUPNAME fi
while read usr do
add_remove_users $usr done exit 0
=====================================================
=====================================
Bài 15. Viết chương trình tạo 50 thư mục đồng thời. #!/bin/bash
echo ” chuong trinh tao 50 thu muc trong linux ”
for ((i=1;$i do mkdir thumuc$i done chạy kịch bản
chmod +x xyz.sh ( xyz.sh là tên file này ) ./xyz.sh
=====================================================
===============================
2 viết chương trình tìm số chia hết cho 5. (N nhập từ bàn phím)
đầu tiên BẠN dùng lện gedit xyz.sh // tạo file xyz có đuôi mở rộng .sh #!/bin/bash
echo ” chuong trinh tinh tong cac so chia het cho 5″ echo “nhap n” read n tong=0;
for ((i=1; $i do
if [ $(($i%5)) ==0 ] then
tong=$(( $tong + $i)) fi done
echo ” dap so :$tong” lưu file lại
chạy scrip như sau
chmod +x xyz.sh ./xyz.sh