1. 程式人生 > >Linux shell 基礎(七),自己慢慢一步步學

Linux shell 基礎(七),自己慢慢一步步學

Linux shell指令碼基礎學習這部分如果只看前面間的理論部分雖然有一些例子,但是還不夠系統,這裡將以具體例項給大家展現Linux shell指令碼程式設計,以幫助大家完善Linux shell基礎的學習和提高。

第2部分 例項

現在我們來討論編寫一個指令碼的一般步驟。任何優秀的指令碼都應該具有幫助和輸入引數。並且寫一個偽指令碼(framework.sh),該指令碼包含了大多數指令碼都需要的框架結構,是一個非常不錯的主意。這時候,在寫一個新的指令碼時我們只需要執行一下copy命令:

cp framework.sh myscript

然後再插入自己的函式。

讓我們再看個例子:

二進位制到十進位制的轉換

指令碼 b2d 將二進位制數 (比如 1101) 轉換為相應的十進位制數。這也是一個用expr命令進行數學運算的例子:

#!/bin/sh

# vim: set sw=4 ts=4 et:

help()

{

cat <

b2h -- convert binary to decimal

USAGE: b2h [-h] binarynum

OPTIONS: -h help text

EXAMPLE: b2h 111010

will return 58

HELP

exit 0

}

error()

{

# print an error and exit

echo "$1"

exit 1

}

lastchar()

{

# return the last character of a string in $rval

if [ -z "$1" ]; then

# empty string

rval=""

return

fi

# wc puts some space behind the output this is why we need sed:

numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `

# now cut out the last char

rval=`echo -n "$1" | cut -b $numofchar`

}

chop()

{

# remove the last character in string and return it in $rval

if [ -z "$1" ]; then

# empty string

rval=""

return

fi

# wc puts some space behind the output this is why we need sed:

numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `

if [ "$numofchar" = "1" ]; then

# only one char in string

rval=""

return

fi

numofcharminus1=`expr $numofchar "-" 1`

# now cut all but the last char:

rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`

}

while [ -n "$1" ]; do

case $1 in

-h) help;shift 1;; # function help is called

--) shift;break;; # end of options

-*) error "error: no such option $1. -h for help";;

*) break;;

esac

done

# The main program

sum=0

weight=1

# one arg must be given:

[ -z "$1" ] && help

binnum="$1"

binnumorig="$1"

while [ -n "$binnum" ]; do

lastchar "$binnum"

if [ "$rval" = "1" ]; then

sum=`expr "$weight" "+" "$sum"`

fi

# remove the last position in $binnum

chop "$binnum"

binnum="$rval"

weight=`expr "$weight" "*" 2`

done

echo "binary $binnumorig is decimal $sum"

該指令碼使用的演算法是利用十進位制和二進位制數權值 (1,2,4,8,16,..),比如二進位制"10"可以這樣轉換成十進位制:

0 * 1 + 1 * 2 = 2

為了得到單個的二進位制數我們是用了lastchar 函式。該函式使用wc –c計算字元個數,然後使用cut命令取出末尾一個字元。Chop函式的功能則是移除最後一個字元。

這個Linux shell指令碼例項幫我們完成了轉換,下一次我們將舉例一個檔案迴圈程式。