









Preview text:
lOMoAR cPSD| 59256994
Tổng hợp các bài tập lập trình shell trong linux
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 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à 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
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à hướng dẫn sử dụng [], $(()). – Tập tin demdong.sh #!/bin/sh lOMoAR cPSD| 59256994
echo “Chuong trinh dem so dong cua tap tin $1” n=0 while read line 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
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 lOMoAR cPSD| 59256994 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 lOMoAR cPSD| 59256994 #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 Shel đọ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` lOMoAR cPSD| 59256994
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 al 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 Shel 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 lOMoAR cPSD| 59256994
Bài 1: Viết chương trình Shel 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 Shel đá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 Shel : myshel –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 lOMoAR cPSD| 59256994 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 trin h shell giaỉ phương trin 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 lOMoAR cPSD| 59256994 exit 0 Bài 2 :
Viêt́ chương trin h shel liêt kê cać tâp̣ tin trong thư muc̣ nhâp̣ vaò tư ̣ ban
phím ma co ́ kić h thước > 4KB theo dạng sau : Tổng số tâp tiṇ 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ươn g thư ́ 5 cuả kêt́ qua ̉ lên ̣ 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: $_昀椀 lesize” done exit 0
==============================================
================================ Bài 7 :
Viêt chương triǹ h shel đoc̣ môṭ danh saćh cać người dùng từ tập n 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 昀椀
al _users=( $(cat $FGROUP | grep -w $GROUPNAME | cut -d: -f4 | tr , ” “) ) # al _users=( $(cat
$FGROUP | awk –F: ‘/$GROUPNAME/ print $4’ | tr , ” “) ) num_usr_grp=$#al _users[@] add_remove_users() local co=0 lOMoAR cPSD| 59256994
for (( i=0; i< num_usr_grp; i++ )) do
if [ “$1” == “$al _users” ] then co=1;break 昀椀 done if [ $co -eq 1 ]; then gpasswd -d $1 $GROUPNAME else
gpasswd -a $1 $GROUPNAME 昀椀 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âṕ
̣ 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 “shi “ . 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 昀椀 while [ “$1” ] do
if [ “$1” = “-b” ];then ob=”$2″ case $ob in 16 ) basesystem=”Hex”;; 8 ) basesystem=”Oct”;;
2 ) basesystem=”Bin”;; * )
basesystem=”Unknown”;; esac shi 2 elif [ “$1” = “- n” ] then num=”$2″ shi 2 else
echo “Program $0 does not recognize op on $1” exit 1 昀椀 done lOMoAR cPSD| 59256994
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 昀椀 le này ) ./xyz.sh
==============================================
======================================
2 viết chương trình m số chia hết cho 5. (N nhập từ bàn phím) đầu ên BẠN dùng lện
gedit xyz.sh // tạo 昀椀 le xyz có đuôi mở rộng .sh #!/bin/bash
echo ” chuong trinh nh 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)) 昀椀
done echo ” dap so :$tong” lưu 昀椀 le lại
chạy scrip như sau chmod +x xyz.sh ./xyz.sh