最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux shell腳本基礎(chǔ)學(xué)習(xí)詳細(xì)介紹(完整版)第2/2頁

 更新時間:2013年07月04日 16:16:45   作者:  
Linux shell腳本基礎(chǔ)學(xué)習(xí)我們將分幾講來慢慢細(xì)說,希望能對想學(xué)習(xí)Linux shell腳本編程的初學(xué)者有一個明確的幫助,水平得到提高



詳細(xì)介紹Linux shell腳本基礎(chǔ)學(xué)習(xí)(五)

Linux shell腳本基礎(chǔ)前面我們在介紹Linux shell腳本的控制流程時,還有一部分內(nèi)容沒講就是有關(guān)here document的內(nèi)容這里繼續(xù)。 

Linux shell腳本基礎(chǔ)已經(jīng)被分成好幾個部分了,這里對控制流程的內(nèi)容也就馬上講完了,這是最后一部分關(guān)于here document,這里舉例稍微有點復(fù)雜,我們慢慢來分析這個復(fù)雜Linux shell腳本。

6. Here documents

當(dāng)要將幾行文字傳遞給一個命令時,here documents(譯者注:目前還沒有見到過對該詞適合的翻譯)一種不錯的方法。對每個腳本寫一段幫助性的文字是很有用的,此時如果我們四有那個 here documents就不必用echo函數(shù)一行行輸出。 一個 "Here document" 以 << 開頭,后面接上一個字符串,這個字符串還必須出現(xiàn)在here document的末尾。下面是一個例子,在該例子中,我們對多個文件進行重命名,并且使用here documents打印幫助:

#!/bin/sh

# we have less than 3 arguments. Print the help text:

if [ $# -lt 3 ] ; then

cat <

ren -- renames a number of files using sed regular expressions

USAGE: ren 'regexp' 'replacement' files...

EXAMPLE: rename all *.HTM files in *.html:

ren 'HTM$' 'html' *.HTM

HELP

exit 0

fi

OLD="$1"

NEW="$2"

# The shift command removes one argument from the list of

# command line arguments.

shift

shift

# $* contains now all the files:

for file in $*; do

if [ -f "$file" ] ; then

newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`

if [ -f "$newfile" ]; then

echo "ERROR: $newfile exists already"

else

echo "renaming $file to $newfile ..."

mv "$file" "$newfile"

fi

fi

done

這是一個復(fù)雜一些的例子。讓我們詳細(xì)討論一下。第一個if表達(dá)式判斷輸入命令行參數(shù)是否小于3個 (特殊變量$# 表示包含參數(shù)的個數(shù)) 。如果輸入?yún)?shù)小于3個,則將幫助文字傳遞給cat命令,然后由cat命令將其打印在屏幕上。打印幫助文字后程序退出。如果輸入?yún)?shù)等于或大于3個,我們 就將第一個參數(shù)賦值給變量OLD,第二個參數(shù)賦值給變量NEW。下一步,我們使用shift命令將第一個和第二個參數(shù)從參數(shù)列表中刪除,這樣原來的第三個 參數(shù)就成為參數(shù)列表$*的第一個參數(shù)。然后我們開始循環(huán),命令行參數(shù)列表被一個接一個地被賦值給變量$file。接著我們判斷該文件是否存在,如果存在則 通過sed命令搜索和替換來產(chǎn)生新的文件名。然后將反短斜線內(nèi)命令結(jié)果賦值給newfile。這樣我們就達(dá)到了我們的目的:得到了舊文件名和新文件名。然 后使用mv命令進行重命名。這樣就明了這個復(fù)雜的Linux shell腳本了吧。

詳細(xì)介紹Linux shell腳本基礎(chǔ)學(xué)習(xí)(六)

Linux shell腳本基礎(chǔ)學(xué)習(xí)我們這里就差不多講完了,最后一部分內(nèi)容是關(guān)于函數(shù)的,這就差不多把基礎(chǔ)部分介紹完了,后面還會有實例。 

4)函數(shù)

如果您寫了一些稍微復(fù)雜一些的程序,您就會發(fā)現(xiàn)在程序中可能在幾個地方使用了相同的代碼,并且您也會發(fā)現(xiàn),如果我們使用了函數(shù),會方便很多。一個函數(shù)是這個樣子的:

functionname()

{

# inside the body $1 is the first argument given to the function

# $2 the second ...

body

}

您需要在每個程序的開始對函數(shù)進行聲明。

下面是一個叫做xtitlebar的腳本,使用這個腳本您可以改變終端窗口的名稱。

這里使用了一個叫做help的函數(shù)。正如您可以看到的那樣,這個定義的函數(shù)被使用了兩次。

#!/bin/sh

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

help()

{

cat <

xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole

USAGE: xtitlebar [-h] "string_for_titelbar"

OPTIONS: -h help text

EXAMPLE: xtitlebar "cvs"

HELP

exit 0

}

# in case of error or if -h is given we call the function help:

[ -z "$1" ] && help

[ "$1" = "-h" ] && help

# send the escape sequence to change the xterm titelbar:

echo -e "33]0;$107"

#

在腳本中提供幫助是一種很好的編程習(xí)慣,這樣方便其他用戶(和您)使用和理解腳本。

命令行參數(shù)

我們已經(jīng)見過$* 和 $1, $2 ... $9 等特殊變量,這些特殊變量包含了用戶從命令行輸入的參數(shù)。迄今為止,我們僅僅了解了一些簡單的命令行語法(比如一些強制性的參數(shù)和查看幫助的-h選項)。 但是在編寫更復(fù)雜的程序時,您可能會發(fā)現(xiàn)您需要更多的自定義的選項。通常的慣例是在所有可選的參數(shù)之前加一個減號,后面再加上參數(shù)值 (比如文件名)

。

有好多方法可以實現(xiàn)對輸入?yún)?shù)的分析,但是下面的使用case表達(dá)式的例子無遺是一個不錯的方法。

#!/bin/sh

help()

{

cat <

This is a generic command line parser demo.

USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2

HELP

exit 0

}

while [ -n "$1" ]; do

case $1 in

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

-f) opt_f=1;shift 1;; # variable opt_f is set

-l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2

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

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

*) break;;

esac

done

echo "opt_f is $opt_f"

echo "opt_l is $opt_l"

echo "first arg is $1"

echo "2nd arg is $2"

您可以這樣運行該腳本:

cmdparser -l hello -f -- -somefile1 somefile2

返回的結(jié)果是:

opt_f is 1

opt_l is hello

first arg is -somefile1

2nd arg is somefile2

這個腳本是如何工作的呢?腳本首先在所有輸入命令行參數(shù)中進行循環(huán),將輸入?yún)?shù)與case表達(dá)式進行比較,如果匹配則設(shè)置一個變量并且移除該參數(shù)。根據(jù)unix系統(tǒng)的慣例,首先輸入的應(yīng)該是包含減號的參數(shù)。

詳細(xì)介紹Linux shell腳本基礎(chǔ)學(xué)習(xí)(七)

Linux shell腳本基礎(chǔ)的學(xué)習(xí)理論知識已經(jīng)講完了,后面是兩個具體的實例,這里先說第一個關(guān)于二進制何時禁止之間的轉(zhuǎn)換。 

Linux shell腳本基礎(chǔ)學(xué)習(xí)這部分如果只看前面間的理論部分雖然有一些例子,但是還不夠系統(tǒng),這里將以具體實例給大家展現(xiàn)Linux shell腳本編程,以幫助大家完善Linux shell基礎(chǔ)的學(xué)習(xí)和提高。

第2部分 實例

現(xiàn)在我們來討論編寫一個腳本的一般步驟。任何優(yōu)秀的腳本都應(yīng)該具有幫助和輸入?yún)?shù)。并且寫一個偽腳本(framework.sh),該腳本包含了大多數(shù)腳本都需要的框架結(jié)構(gòu),是一個非常不錯的主意。這時候,在寫一個新的腳本時我們只需要執(zhí)行一下copy命令:

cp framework.sh myscript

然后再插入自己的函數(shù)。

讓我們再看個例子:

二進制到十進制的轉(zhuǎn)換

腳本 b2d 將二進制數(shù) (比如 1101) 轉(zhuǎn)換為相應(yīng)的十進制數(shù)。這也是一個用expr命令進行數(shù)學(xué)運算的例子:

復(fù)制代碼 代碼如下:

#!/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"


該腳本使用的算法是利用十進制和二進制數(shù)權(quán)值 (1,2,4,8,16,..),比如二進制"10"可以這樣轉(zhuǎn)換成十進制:

0 * 1 + 1 * 2 = 2

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

這個Linux shell腳本實例幫我們完成了轉(zhuǎn)換,下一次我們將舉例一個文件循環(huán)程序。 

詳細(xì)介紹Linux shell腳本基礎(chǔ)學(xué)習(xí)(八)

Linux shell腳本基礎(chǔ)學(xué)習(xí)實例前面說明了十進制和二進制的轉(zhuǎn)換,這里舉最后一個例子,關(guān)于文件的循環(huán),同時也說明一下如何調(diào)試,來結(jié)束我們的課程。 

Linux shell腳本前面的實例是說明十進制和二進制的轉(zhuǎn)換,還以一個有關(guān)文件循環(huán)的實例來結(jié)束這部分內(nèi)容的學(xué)習(xí)。相信Linux shell腳本的基礎(chǔ)學(xué)習(xí)的學(xué)習(xí)者應(yīng)該能夠掌握一些簡單的Linux shell腳本的編寫。
文件循環(huán)程序

或許您是想將所有發(fā)出的郵件保存到一個文件中的人們中的一員,但是在過了幾個月以后,這個文件可能會變得很大以至于使對該文件的訪問速度變慢。下面的 腳本rotatefile可
以解決這個問題。這個腳本可以重命名郵件保存文件(假設(shè)為outmail)為outmail.1,而對于 outmail.1就變成了outmail.2 等等等等...

復(fù)制代碼 代碼如下:

#!/bin/sh
# vim: set sw=4 ts=4 et:
ver="0.1"
help()
{
cat <
rotatefile -- rotate the file name
USAGE: rotatefile [-h] filename
OPTIONS: -h help text
EXAMPLE: rotatefile out
This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
and create an empty out-file
The max number is 10
version $ver
HELP
exit 0
}
error()
{
echo "$1"
exit 1
}
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;;
--) break;;
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
# input check:
if [ -z "$1" ] ; then
error "ERROR: you must specify a file, use -h for help"
fi
filen="$1"
# rename any .1 , .2 etc file:
for n in 9 8 7 6 5 4 3 2 1; do
if [ -f "$filen.$n" ]; then
p=`expr $n + 1`
echo "mv $filen.$n $filen.$p"
mv $filen.$n $filen.$p
fi
done
# rename the original file:
if [ -f "$filen" ]; then
echo "mv $filen $filen.1"
mv $filen $filen.1
fi
echo touch $filen
touch $filen

這個腳本是如何工作的呢?在檢測用戶提供了一個文件名以后,我們進行一個9到1的循環(huán)。文件9被命名為10,文件8重命名為9等等。循環(huán)完成之后,我們將原始文件命名為文件1
同時建立一個與原始文件同名的空文件。

調(diào)試

最簡單的調(diào)試命令當(dāng)然是使用echo命令。您可以使用echo在任何懷疑出錯的地方打印任何變量值。這也是絕大多數(shù)的shell程序員要花費80%的時間來調(diào)試程序的原因。Shell程序的
好處在于不需要重新編譯,插入一個echo命令也不需要多少時間。

shell也有一個真實的調(diào)試模式。如果在腳本"strangescript" 中有錯誤,您可以這樣來進行調(diào)試:

sh -x strangescript

這將執(zhí)行該腳本并顯示所有變量的值。

shell還有一個不需要執(zhí)行腳本只是檢查語法的模式。可以這樣使用:

sh -n your_script

這將返回所有語法錯誤

這里L(fēng)inux shell腳本基礎(chǔ)學(xué)習(xí)就全部結(jié)束了。感謝大家的支持。

相關(guān)文章

  • Linux Shell 數(shù)組的創(chuàng)建及使用技巧

    Linux Shell 數(shù)組的創(chuàng)建及使用技巧

    這篇文章主要介紹了Linux Shell 數(shù)組的創(chuàng)建及使用技巧,本文講解了數(shù)組定義、數(shù)組讀取與賦值以及特殊使用,需要的朋友可以參考下
    2015-07-07
  • Linux?shell字符串截取、替換、刪除以及trim代碼示例

    Linux?shell字符串截取、替換、刪除以及trim代碼示例

    在Shell編程中,截取、替換、刪除字符串是非常常見的操作,這篇文章主要給大家介紹了關(guān)于Linux?shell字符串截取、替換、刪除以及trim的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 編寫shell腳本實現(xiàn)tomcat定時重啟的方法

    編寫shell腳本實現(xiàn)tomcat定時重啟的方法

    這篇文章主要介紹了編寫shell腳本實現(xiàn)tomcat定時重啟的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 一個簡單的linux命令 mkdir

    一個簡單的linux命令 mkdir

    這篇文章主要介紹了一個簡單的linux命令mkdir,mkdir 命令用于創(chuàng)建指定名稱的目錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 一文教會你如何使用grep跨多行查找模式匹配

    一文教會你如何使用grep跨多行查找模式匹配

    grep匹配是linux的最常用的shell命令之一,這篇文章主要給大家介紹了關(guān)于如何使用grep跨多行查找模式匹配的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • gearman隊列持久化引發(fā)的問題及解決方法

    gearman隊列持久化引發(fā)的問題及解決方法

    這篇文章主要介紹了gearman隊列持久化引發(fā)的問題及解決方法,需要的朋友可以參考下
    2014-07-07
  • Shell腳本定時備份清除運行系統(tǒng)日志的代碼

    Shell腳本定時備份清除運行系統(tǒng)日志的代碼

    寫備份并清除老日志Shell腳本,并附帶一個清除日志(log)的shell腳本代碼,需要的朋友可以參考下
    2013-02-02
  • 腳本批量檢測網(wǎng)站是否存活

    腳本批量檢測網(wǎng)站是否存活

    這篇文章主要介紹了批量檢測網(wǎng)站是否存活的腳本,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Shell腳本實現(xiàn)自動修改IP地址

    Shell腳本實現(xiàn)自動修改IP地址

    這篇文章主要介紹了Shell腳本實現(xiàn)自動修改IP地址,本文直接給出實現(xiàn)代碼,并在代碼中標(biāo)注大量注釋,需要的朋友可以參考下
    2014-10-10
  • bash shell的條件語句詳解

    bash shell的條件語句詳解

    文章主要介紹了bash shell中的條件語句,包括if-then-fi、else、elif等結(jié)構(gòu)的使用規(guī)則,以及條件判斷符號(如-eq、-lt等)的正確使用方法,感興趣的朋友一起看看吧
    2024-12-12

最新評論

甘孜| 五大连池市| 鄱阳县| 龙游县| 离岛区| 河间市| 昌黎县| 潜江市| 阜宁县| 北流市| 长子县| 汨罗市| 麦盖提县| 婺源县| 萨迦县| 仙游县| 康乐县| 北碚区| 温宿县| 星子县| 驻马店市| 中卫市| 山东| 鹰潭市| 马山县| 宜宾市| 文水县| 崇礼县| 微山县| 周至县| 赤峰市| 柏乡县| 交城县| 台南市| 谢通门县| 平陆县| 怀柔区| 隆德县| 思茅市| 德阳市| 遂川县|