2010年5月12日 星期三

linux homework2

1.設計一個名為addtwo的script,使其可以接收兩個數字參數,並將其相加後的結果顯示出來,如果參數個數不夠或太多,就不執行運算,而顯示一段訊息,提示出正確的執行方式必須給兩個參數。

$ ./addtwo 12 6
sum = 18
$

$ ./addtwo 12
Usage: ./addtwo number1 number2
$


#!/bin/sh
if [ -n "$3" ]
then
echo "Usage: ./addtwo number1 number2"
elif [ -z "$2" ]
then
echo "Usage: ./addtwo number1 number2"
else
echo "sum = `expr $1 + $2 `"
fi
exit 0



----
2.設計一個名為mycal的script,
使其可以接收三個數字參數,
第一、三個參數為數字,
第二個參數為運算子(+-*/其中之一)
以多層的if計算其結果,並將其結果顯示出來,
如果參數個數不夠或太多,就不執行運算,
而顯示一段訊息,
提示出正確的執行方式。
如果中間的運算子是/,而第三個參數是0,則顯示除數不可為0

$ ./mycal 12 + 3
result = 15
$

$ ./mycal 12 - 3
result = 9
$

$ ./mycal 12 \* 3   # 注意:*為特殊符號,需加一倒斜線輸入
result = 36
$

$ ./mycal 12 / 3
result = 4
$

$ ./mycal 12 / 0
無法計算:除數不可為0
$


#!/bin/sh


if [ $# -eq 3 ]
then
 case "$2" in
"+")
a=` expr $1 + $3 ` ; echo "result = $a"
;;
"-")
b=` expr $1 - $3 ` ; echo "result = $b"
;;
"*")
c=` expr $1 \* $3 ` ; echo "result =$c"  
;;
"/")
if [ $3 -eq 0 ]
then 
echo "無法計算:除數不可為0 "
else
d=` expr $1 / $3 ` ; echo "result = $d"
fi
;;
 esac
else
    echo "第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)"
fi


exit 0



----
3.設計一個名為getmax的script,使其可以接收兩個數字參數,將較大的數顯示出來,如果都一樣大,則顯示都一樣大。

$ ./maxmin 18 15
max = 18
$

$ ./maxmin 15 15
Equals
$

#!/bin/sh

x=$1
y=$2


if [ $x -gt $y ]
then 
echo " max = $x "
else
if [ $x -lt $y ]
then
echo " max = $y "
else
echo "Equals"
fi
fi


exit 0


----
4.設計一個名為checkfile的script,使其可以接收一個檔案名稱作為參數,
若此名稱不是目前工作目錄的檔案或目錄,則顯示此名稱不存在,
如果是檔案,則顯示其檔案內容,如果是一目錄則顯示此目錄內的清單。

$ ./checkfile 名稱


#!/bin/sh


df=$1


if [ -e "$df" ]
then
if [ -f "$df" ]
then
cat $df
else
if [ -d "$df" ]
then
ls -l $df
else
echo "名稱不存在"
fi
fi
else
echo "名稱不存在"
fi


exit 0



----
5.設計一個名為newerfile的script,使其可以接收兩個檔案名稱作為參數,並將日期較新的檔案名稱顯示出來。

$ ./newerfile file1.txt file2.txt
file2.txt 較新


#!/bin/sh


if [ $1 -nt $2 ]
then
echo "$1 較新 "
else
echo "$2 較新"
fi


exit 0


----
6.設計一個名為avglen的script,
使其可以接收一個檔案名稱(文字檔)作為參數,
計算此檔平均每一列有多少bytes。
提示:使用wc -l < 檔名; 用man查一下wc的用法

$ ./avglen yang.txt
平均每列: 348 bytes


#1/bin/sh


avg=`expr $(wc -c < $1 ) / $(wc -l < $1)`
echo "平均每列: $avg bytes"




exit 0



----
7.設計一個名為createtodayfile的script,以touch指令產生一個檔案,檔名中含有今天的日期,例如myfile20090706.txt。
  date +%Y...., 其餘date的日期格式, 請以man指令查詢


#!/bin/sh


echo -n "輸入檔案名稱:"
read fname


touch ${fname}$(date +%Y%m%d)\.txt


exit 0



----
8.設計一個名為addfiles的script,
可自命令列讀取參數產生檔案allfile,
如下,每加入一個檔案,隔2秒,如果重覆執行,則覆蓋原檔案。

原始檔案:
$ cat filea.txt
aaaaa
$ cat fileb.txt
bbbbb
$ cat filec.txt
ccccc

執行程式:
$ ./addfiles allfile.txt filea.txt fileb.txt filec.txt

結果:
$ cat allfile.txt
--2009-09-08 16:25:33
aaaaa
--2009-09-08 16:25:35
bbbbb
--2009-09-08 16:25:37
ccccc


#!/bin/sh


af=$1
rm -f $af
touch $af
shift
for y in $@
do
date +--%F\ %T >> $af
cat $y >> $af
sleep 2
done
cat $af
exit 0

沒有留言:

張貼留言