Bài tập thực hành 1 - Shell script

bài tập

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 dng độ 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 loi 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 dng lệnh cho phép đọc 3 loi trước tiên trong 1 file văn bản
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 tên file text
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 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ệtcá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 WHILElệ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ố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 đối số truyền vào. Khicâ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êṭ cać tâp
tin trong thư muc
nhâp
vaò baǹ
phím ma co kić h thước > 4KB theo dng sau :
Tổng số tâp
tin
Tập tin 1 click thước
…..
tập in n kích tớ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ả 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 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 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 đ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
| 1/10

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
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 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 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 đ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