星期三, 5月 12, 2010

Shell Script HW3

Linux Programing Homework 3

1.設計一個名為mycal的script,使其可以接收三個數字參數,第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)
配合case命令,計算數字運算的結果,並將其結果顯示出來,如果參數個數不夠或太多,就不執行運算,而顯示一段訊息,
提示出正確的執行方式。如果中間的運算子是/,而第三個參數是0,則顯示除數不可為0
將各個運算功能分別寫成函數。

$ ./mycal 12 + 3
result = 15
$

$ ./mycal 12 - 3
result = 9
$


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

$ ./mycal 12 / 3
result = 4
$
----


#!/bin/sh

cal()
{
if [ "$2" = "*" ]
then
   echo "result = `expr $1 \* $3`"
else
if [ "$2" = "/" -a "$3" = "0" ]
  then
   echo "無法計算:除數不可為0"
else
   echo "result = `expr $@`"
fi
fi
}
if [ -z "$3" -o -n "$4" ]
then
echo "請輸入三個參數,第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)"
else
case "$2" in
"+")
cal $@
;;
"-")
cal $@
;;
"*")
cal $1 \* $3
;;
"/")
cal $@
;;
 
esac
fi

exit 0


2.設計一個名為manymaxmin的script,使其可以接收不固定的多個數字參數,顯示數字中最大的及最小的,如果都一樣大,則顯示都一樣大。

$ ./maxmin 12 18 9 32 24 13
max = 32
min = 9
$

$ ./maxmin 15 15 15 15 15 15
All Equal = 15
$
----


#!/bin/bash

max=$1
min=$1
for x in $@
do
  if [ $x -gt $max ]
  then
      max=$x
  else
    if [ $x -lt  $min ]
    then
        min=$x
fi
fi
done
  if [ $max = $min ]
  then
      equ=$max
  echo "All Equal = $equ"
  else
  echo "max = $max"
  echo "min = $min"
  fi

exit 0


3.設計一個名為createmyfiles的script,以迴圈配合touch指令,產生十個檔案,檔名分別為myprog1.c,myprog2.c,...,myprog10.c。
----


#!/bin/sh

for ((x=1;x<=10;x++))
do
`touch myprog$x.c`
done

exit 0


4.設計一個名為lastfiles的script,顯示目前目錄中最近被修改的n個檔案檔名。

$ ./lastfiles 5
a1.txt
a3.txt
...共5個
----


#!/bin/sh

ls -t |head -$1 |nl

exit 0


5.設計一個名為mvfiles的script,可以將所有副檔名為.c檔案,副檔名更名為.cpp,更名前後的副檔名均自命令列輸入。
並將更名的結果顯示出來。

$ ./mvfiles .c .cpp
renamed myprog1.c to myprog1.cpp
....
....
$
----


#!/bin/sh

x=$1
y=$2
for file in *$x
do
mv $file `basename $file $x`$y
        echo "renamed $file to `basename $file $x`$y"
done

exit 0

Shell Script HW2

Linux Shell Script Programming hw 2

所有程式的副檔名,請自行加上.sh

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

$ ./addtwo 12 6
sum = 18
$

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


#!/bin/sh

x=$1
y=$2
z=$3

((sum=x+y))
if [ -z "$y" -o -n "$z" ]
then
    echo "Usage: ./addtwo number1 number2"
else
    echo "sum = $sum"
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

x=$1
y=$2
z=$3
w=$4

(( sum = x + z ))
(( sub = x - z ))
(( mul = x * z ))
(( div = x / z ))
if [ -z "$z" -o -n "$w" ]
then
echo "輸入三個參數,第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)"
else
if [ "$z" = '0' ] && [ "$y" = "/" ]
then
echo "無法計算:除數不可為0"
else
     if [ "$y" = "+" ]
   then
     echo "result = $sum"
     else
         if [ "$y" = "-" ]
         then
         echo "result = $sub"
         else
             if [ "$y" = "*" ]
             then
             echo "result = $mul"
             else
                 if [ "$y" = "/" ]
               then
                 echo "result = $div"

fi
fi
fi
fi
fi
fi

exit 0


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

$ ./maxmin 18 15
max = 18
$

$ ./maxmin 15 15
Equals
$
----


#!/bin/sh

x=$1
y=$2

if ((x>y))
then
echo "max = $x"
else
    if ((x
    then
    echo "max = $y"
        else
        echo "Equals"

fi
fi
exit 0


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

$ ./checkfile 名稱
----


#!/bin/sh

x=$1

if [ -f "$x" ]
then
echo "`cat $x`"
else
    if [ -d "$x" ]
    then
    echo "`ls $x`"
        else
        echo "此名稱不存在"
fi
fi
exit 0


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

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


#!/bin/sh

x=$1
y=$2

if [ $x -nt $y ]
then
echo "$x 較新"
else
    echo "$y 較新"
fi
exit 0


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

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


#!/bin/sh

x=$1

(( L="`wc -l < $x`" ))
(( C="`wc -c < $x`" ))
echo "`expr $C / $L` "

exit 0


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


#!/bin/sh

$(touch "myfile_`date +%Y-%m-%d_%H:%M:%S.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
a=$1
$(touch $1)

for ((x=1;x<=3;x++))
do
shift
y=$(cat $1)
echo "--`date +%Y-%m-%d\ %H:%M:%S`" | tee -a $a
echo $y | tee -a $a
sleep 2
done

exit 0

Shell Script HW1


Linux Shell Script Programming hw 1

所有程式的副檔名,請自行加上.sh

----
1.設計一個名為showme的script,藉由環境變數及一些Linux指令,使其可以顯示資訊如下:

$ showme
我是  <- login name
我的家在 <- home directory
我的家有下列這些東西:
<- ls home directory

我的殼是 <- shell name
這台電腦是 <- host name
我目前的工作目錄是 <- present woring directory
目前的工作目錄有下列這些東西:"
<- ls present woring directory
----


#!/bin/sh

echo "我是$LOGNAME"
echo "我的家在$HOME"
echo "我的家有下列這些東西:`ls ${HOME}`"
echo "我的殼是$SHELL"
echo "這台電腦是$HOSTNAME"
echo "我目前的工作目錄是$PWD"
echo "目前的工作目錄有下列這些東西:`ls ${PWD}`"

exit 0


2.設計一個名為verbvar的script,利用read輸入一個簡單的英文動詞,在其前加入一個to印出原形,字尾加ing印出作為進行式
,字尾加ed印出作為過去式。

$ ./verbvar
請輸一個動詞: work
原  形: to work
進行式: working
過去式: worked
----


#!/bin/sh

echo -n "請輸一個動詞: "
read verb
echo "原  形: to ${verb}"
echo "進行式: ${verb}ing"
echo "過去式: ${verb}ed"

exit 0




沒多少時間了

為了NCLP奮鬥吧,同學們!!
除了LINUX,同時還有IDB、CMS、SHELL在考驗著我們.
我要好好把握在資策會剩下的三個月.