You are on page 1of 18

./demdong bai1.

txt
6.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
=========================================================
==================================
6.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
6.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 1: 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 2: 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 3: 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 4: 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 5: 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 6 : 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 2 :
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 7 :
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 8
Viêt́ chương triǹ h đôỉ 1 sô ́ tư ̀ hê ̣ thâp ̣ phân 10 ( Dec ) sang hê ̣ 2 (Bin), 8 (Oct)
, 16 (Hex).
Vi ́ du ̣ : convert –b 16 –n 500 co ́ nghiã la ̀ đôỉ sô ́ 500 sang cơ sô ́ 16.
chú ý : đoaṇ code dươí đây cuñ g duǹ g đê m ̉ inh hoạ lêṇ h “shift “ . Baṇ co ́ thê ̉
go ̃ tham sô ́ cuả chương trình theo 2 hướng dẫn :
./convert –b radix –n number hoăc ̣ ./conver –n number –b radix
Code:
#!/bin/bash
if [ $# -ne 4 ]; then
echo “Usage : $0 -b radix -n number or $0 -n number -b radix”
exit 1
fi
while [ “$1” ]
do
if [ “$1” = “-b” ];then
ob=”$2″
case $ob in
16 ) basesystem=”Hex”;;
8 ) basesystem=”Oct”;;
2 ) basesystem=”Bin”;;
* ) basesystem=”Unknown”;;
esac
shift 2
elif [ “$1” = “-n” ]
then
num=”$2″
shift 2
else
echo “Program $0 does not recognize option $1”
exit 1
fi
done
op=$(echo “obase=$ob;ibase=10;$num;” | bc)
echo “$num Decimal number = $op in $basesystem number system (base=$ob)”
exit 0
1. 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
Bài 3 . Chương trình đếm số dòng của một tệp tin 
#!/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”
}<$1
exit 0

Bài4. Chương trình đếm số từ của một tập tin


#!/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”
}<$1
exit 0
Bài5. Chương trình tìm dòng có độ dài lớn nhất trong một tập tin
#!/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”
}<$1
exit 0

Bài 6.Chương trình tìm một xâu trong một tập tin
#!/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
}<$2
exit 0

Bài 7. 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<n; 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<n; i++))
do
max=$(max2nums ${a[$i]} $max)
done
echo "max = $max"
}
input
maxs
exit $?
Bài 8. Viết 1 chương trình Shell đọc từng dòng 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ó muốn đọc dòng kế tiếp
ko ? y/n” nếu trả lời là “y” hoặc “Y” thì in dòng kế tiếp,trong trường hợp ngược
lại thì kết thúc chương trình
#!/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 ${count}p $filename
done
exit 0

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 nội dung file này, nhưng với tất cả ký tự đều viết
hoa
#!/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]’ <$filename
exit 0

Bài 10. 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ố.
#!/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 3: Viết một script tên taothumuc cho phép người dùng nhập vào tên thư mục
muốn tạo và thực hiện việc tạo thư mục. Trường hợp tạo không thành công thì in
ra câu thông báo: “Khong the tao duoc thu muc!!!”.

Tạo file script tên taothumuc.sh


clear
echo "Nhap ten thu muc:"
read dir_name
mkdir $dir_name
if test $? -eq 0; then
clear
echo "Thu muc $dir_name da duoc tao ^^"
else
clear
echo "Khong the tao thu muc ten $dir_name!"
fi

Bài 4: Viết một script với tên thuchien nhận vào 2 tham số cmd1 và arg1. Trong
đó cmd1 là lệnh cần thực hiện và arg1 là tham số của lệnh. Khi script được thực
hiện thì lệnh cmd1 sẽ được thực hiện. Ví dụ: thuchien mkdir aaa sẽ thực hiện tạo
thư mục aaa.

Tạo file script tên thuchien.sh


clear
$1 $2
if test $? -eq 0; then
clear
echo "Xong roi"
else
echo "Loi!!"
fi

You might also like