Giải Các bài tập LẬp TrÌnh Shell Trong Linux - pdf 19

1 số bài mẫu


LẬP TRÌNH SHELL
6.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 sử 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
===============================================================================================

6.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à cách sử 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

========================================================================================
6.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à cách 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”
}<$1
exit 0

- Chạy chương trình :
chmod a+x demdong.sh
./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”
}<$1
exit 0

- Chạy chương trình :
chmod a+x demtu.sh
./demtu bai1.txt

===========================================================================================
6.5. Chương trình tìm dòng có độ dài lớn 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”
}<$1
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
}<$2
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<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 1: 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 không ? y/n” nếu trả lời là “y” hay
“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 đọ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 ${count}p $filename
done
exit 0

============================================================================================

Bài 2: Viết 1 dòng lệnh cho phép đọc 3 dòng đầu tiên trong 1 file văn bản mà không đượ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 nội dung file này, nhưng với tất cả 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]’ <$filename
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 dòng 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 >$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 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 phân tích 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 có thể 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 kích 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 $( find $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<index; 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ć user từ tập tin users rồi kiểm tra xem các user này có thuộc group W3 hay không? Nêú co ́ user naò thuôc̣ group thi ̀ xoá user đo ́ ra khoỉ group W3 ngươc̣ lại thi ̀ thêm user đ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 <$UFILE
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 đê ̉minh hoạ lêṇ h “shift “ . Baṇ co ́ thê ̉ go ̃ tham sô ́ cuả chương trình theo 2 cách :
./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 cùng lúc.
#!/bin/bash
echo " chuong trinh tao 50 thu muc trong linux "
for ((i=1;$i<=50; i=$i+1))
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<=n; i=$i+1))
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


Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status