Shell腳本大量示例

幾乎所有的腳本里都有某種流控制結構,很少有例外。流控制是什么?假定有一個腳本,包含下列幾個命令:

#!/bin/sh
# make a directory
mkdir /home/dave/mydocs
# copy all doc files
cp *.docs /home/dave/docs
# delete all doc files
rm *.docs

上述腳本問題出在哪里?如果目錄創建失敗或目錄創建成功文件拷貝失敗,如何處理?這里需要從不同的目錄中拷貝不同的文件。必須在命令執行前或最后的命令退出前決定處理方法。shell會提供一系列命令聲明語句等補救措施來幫助你在命令成功或失敗時,或需要處理一個命令清單時采取正確的動作。這些命令語句大概分兩類:

1、循環和流控制

  • if 語句
    提供條件測試。測試可以基于各種條件。例如文件的權限、長度、數值或字符串的比較。這些測試返回值或者為真(0),或者為假(1)。基于此結果,可以進行相關操作。在講到條件測試時已經涉及了一些測試語法。
  • case語句
    允許匹配模式、單詞或值。一旦模式或值匹配,就可以基這個匹配條件作其他聲明。

2、循環

循環或跳轉是一系列命令的重復執行過程,本書提到了3種循環語句:

  • for 循環
    每次處理依次列表內信息,直至循環耗盡。
  • Until 循環
    此循環語句不常使用, until循環直至條件為真。條件部分在循環末尾部分。
  • While 循環
    while循環當條件為真時,循環執行,條件部分在循環頭。
    流控制語句的任何循環均可嵌套使用,例如可以在一個for循環中嵌入另一個for循環。

二、實例講解

現在開始講解循環和控制流,并舉一些腳本實例。

從現在起,腳本中語句使用LINUX或BSD版本,也就是說使用echo方法echo -e -n,意即從echo結尾中下一行執行命令。

1、grep輸出檢查

不必拘泥于變量或數值測試,也可以測知系統命令是否成功返回。對grep使用if語句找出,grep是否成功返回信息。下面的例子中grep用于查看Dave是否在數據文件data.file中,注意’Dave>‘用于精確匹配。
[root@localhost ~]# cat grepif.sh 
#!/bin/sh
# grepif.sh
if grep 'Dave\>' data.file > /dev/null 2>&1
thenecho "Great Dave is in the file"
elseecho "No Dave is not in the file"
fi
[root@localhost ~]# ./grepif.sh 
No Dave is not in the file

2、用變量測試grep輸出

正像前面看到的,可以用grep作字符串操作。下面的腳本中,用戶輸入一個名字列表,grep在變量中查找,要求其包含人名Peter
[root@localhost ~]# cat grepstr.sh 
#!/bin/sh
# grepstr
echo -n "Enter a list of names:"
read list
if echo $list | grep "Peter" > /dev/null 2>&1
thenecho "Peter is here"# could do some processing here...
elseecho "Peter's not in the list. No comment!"
fi
[root@localhost ~]# ./grepstr.sh 
Enter a list of names:John Louise Peter James
Peter is here

3、文件拷貝輸出檢查

下面測試文件拷貝是否正常,如果cp命令并沒有拷貝文件myfile到myfile.bak,則打印錯誤信息。注意錯誤信息中basename $0打印腳本名。如果腳本錯誤退出,一個好習慣是顯示腳本名并將之定向到標準錯誤中。用戶應該知道產生錯誤的腳本名。
 [root@localhost ~]# cat ifcp.sh 
#!/bin/sh
# ifcp.sh
if cp myfile myfile.bak; thenecho "good copy"
elseecho "`basename $0`: error could not copy the file" >&2
fi
[root@localhost ~]# ./ifcp.sh 
cp: cannot stat `myfile': No such file or directory
ifcp.sh: error could not copy the file
注意,文件可能沒找到,系統也產生本身的錯誤信息,這類錯誤信息可能與輸出混在一起。既然已經顯示系統錯誤信息獲知腳本失敗,就沒必要顯示兩次。要去除系統產生的錯誤和系統輸出,只需簡單的將標準錯誤和輸出重定向即可。修改腳本為: >/dev/null 2>&1。
[root@localhost ~]# cat ifcp.sh 
#!/bin/sh
# ifcp.sh
if cp myfile myfile.bak > /dev/null 2>&1; thenecho "good copy"
elseecho "`basename $0`: error could not copy the file" >&2
fi
[root@localhost ~]# ./ifcp.sh 
ifcp.sh: error could not copy the file
上面當中>/dev/null表示任何標準輸出都定向到那個無盡的“黑洞”/de/null中,然后2>&1表示錯誤輸出也是到/dev/null中,&1表示前面的那個/dev/null,腳本運行時,所有輸出包括錯誤重定向至系統垃圾堆。

4、當前目錄測試

當運行一些管理腳本時,可能要在根目錄下運行它,特別是移動某種全局文件或進行權限改變時。一個簡單的測試可以獲知是否運行在根目錄下。下面腳本中變量DIRECTORY使用當前目錄的命令替換操作,然后此變量值與” / “字符串比較( /為根目錄)。如果變量值與字符串不等,則用戶退出腳本,退出狀態為1意味錯誤信息產生。
[root@localhost ~]# cat ifpwd.sh 
#!/bin/sh
# ifpwd.sh
DIRECTORY=`pwd`
# grab the current dirctory
if [ "$DIRECTORY" != "/" ]; then# is it the root directory ?# no, the direct output to standard error, which is the screen# by default.echo "You need to be in the root directory no $DIRECTORY to runthis script" >&2# exit with a value of 1, an errorexit 1
fi
[root@localhost ~]# ./ifpwd.sh 
You need to be in the root directory no /root to runthis script

5、文件權限測試

可以用i f語句測試文件權限,下面簡單測試文件test.txt是否被設置到變量LOGNAME,測試test.txt文件是否具有寫的權限。下面的腳本先建立一個test.txt的空白文檔,列出它的相關權限。然后執行腳本測試其是否可以寫入,然后顯示相關信息。
[root@localhost ~www.yigouyule2.cn]# touch test.txt
[root@localhost ~www.feifanyule.cn/]# ls -l test.txt
-rw-r--r-- 1 root www.boshenyl.cn root 0 Nov 21 15:21 test.txt
[root@localhost ~www.taohuayuan178.com]# chmod u+x ifwr.sh 
[root@localhost www.qinlinyule.cn~]# cat ifwr.sh 
#!/bin/sh
# ifwr.sh
LOGFILE=test.txt
echo $LOGFILE
if [ ! -w "$LOGFILE" ]; thenecho " You cannot write to $LOGFILE" >&2
elseecho " You can write to $LOGFILE" >&2
fi
[root@localhost ~]# ./ifwr.sh 
test.txt
You can write to test.txt

6、測試傳遞到腳本中的參數

if語句可用來測試傳入腳本中參數的個數。使用特定變量$#,表示調用參數的個數。可以測試所需參數個數與調用參數個數是否相等。以下測試確保腳本有三個參數。如果沒有,則返回一個可用信息到標準錯誤,然后代碼退出并顯示退出狀態。如果參數數目等于3,則顯示所有參數。
 [root@localhost ~]# cat ifparam.sh 
#!/bin/sh
# ifparam
if [ $# -lt 3 ]; then# less than 3 parameters called, echo a usage message and exit# 如果少于三個參數則顯示使用的信息,然后退出。echo "Usage: `basename $0`arg1 arg2 arg3" >&2exit 1
fi
# good, received 3 params, let's echo them
# 好,現在接受了三個參數,讓我們開始顯示他們
echo "arg1: $1"
echo "arg2: $2"
echo "arg3: $3"
[root@localhost ~]# ./ifparam.sh cup medal
Usage: ifparam.sharg1 arg2 arg3
[root@localhost ~]# ./ifparam.sh cup medal trophy
arg1: cup
arg2: medal
arg3: trophy
從上面的運行信息可以看出,如果只傳入兩個參數,則顯示一可用信息,然后腳本退出。只有正確傳入了三個參數了,才顯示所有的參數然后退出。

7、決定腳本是否為交互模式

有時需要知道腳本運行是交互模式(終端模式)還是非交互模式(cron或at)。腳本也許需要這個信息以決定從哪里取得輸入以及輸出到哪里,使用test命令并帶有-t選項很容易確認這一點。如果test返回值為1,則為交互模式。假如我是在一個終端下運行下面這個腳本。
[root@localhost ~]# cat ifinteractive.sh 
#!/bin/sh
# ifinteractive.sh
if [ -t ]; thenecho "We are interactive with a terminal"
elseecho "We must be running from some background process probablycron or at"
fi
[root@localhost ~]# ./ifinteractive.sh 
We are interactive with a terminal

8、變量設置測試

下面的例子測試環境變量EDITOR是否已設置。如果EDITOR變量為空,將此信息通知用戶。如果已設置,在屏幕上顯示編輯類型。
 [root@localhost ~]# cat ifeditor.sh #!/bin/sh# ifeditor.shif [ -z $EDITOR ]; then# the variable has not been set# 變量沒有設置echo "Your EDITOR environment is not set"else# let's see what it is# 如果設置了,讓我們來看看它到底是什么echo "Using $EDITOR as the default editor"fi[root@localhost ~]# ./ifeditor.sh Your EDITOR environment is not set

9、將腳本參數傳入系統命令

可以向腳本傳遞位置參數,然后測試變量。這里,如果用戶在腳本名字后鍵入目錄名,腳本將重設$1特殊變量為一更有意義的名字。即DIRECTORY。這里需測試目錄是否為空,如果目錄為空,ls -A將返回空,然后對此返回一信息。
# ifdirec.sh
# assigning $1 to DIRECTORY variable
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" == "" ]; then# if it's an empty string, then it's emptyecho "$DIRECTORY is indeed empty"
else ? ?# otherwise it is notecho "$DIRECTORY is not empty"
fi
也可以使用下面的腳本替代上面的例子并產生同樣的結果
[root@localhost ~]# cat ifdirec2.sh 
#!/bin/sh
# ifdirec2
DIRECTORY=$1
if [ -z "`ls -A $DIRECTORY`" ]
thenecho "$DIRECTORY is indeed empty"
elseecho "$DIRECTORY is not empty"
fi

10、null命令用法

到目前為止,條件測試已經講完了then和else部分,有時也許使用者并不關心條件為真或為假。不幸的是if語句各部分不能為空—一些語句已經可以這樣做。為解決此問題, shell提供了:空命令。空命令永遠為真(也正是預想的那樣)。回到前面的例子,如果目錄為空,可以只在then部分加入命令。
[root@localhost ~]# cat ifdirectory.sh 
#!/bin/sh
# ifdirectory.sh
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" == "" ]
thenecho "$DIRECTORY is indeed empty"
else :# do nothing
fi
[root@localhost ~]# ./ifdirectory.sh testd
testd is indeed empty

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538616.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark 常見問題小結

原文地址:http://www.aboutyun.com/thread-9946-1-1.html -------------------------------------- 問題導讀 1、當前集群的可用資源不能滿足應用程序的需求,怎么解決? 2、內存里堆的東西太多了,有什么好辦法嗎? …

dataframe數據標準化處理_數據預處理——標準化/歸一化(實例)

這次我們來說說關于數據預處理中的數據標準化及歸一化的問題。主要以理論實例的方式為大家展示。本次實驗也將會展示部分數據以及代碼,有興趣的小伙伴可以自己動手試試~在本次實例過程中,我們使用的數據是:2010-2018年間廣州市經濟與環境的時…

python實現自動打電話軟件_全自動手勢聯系軟件 讓你輕輕松松打電話

電話號碼超級多的童鞋們,由于手機里存儲的電話太多,每次要找某個人的電話很難找,有木有同感的?小編今天像大家推薦一款新潮的幫助你輕松找到想要的電話的模式,有沒有很想知道呢?其實小編本來是想賣個關子的…

電腦的虛擬服務器位置,如何配置基于IP地址的虛擬主機

滿意答案虛擬主機簡介:1. 把一臺運行在互聯網上的服務器分成多個虛擬的服務器。2. 每一個虛擬主機都具有獨立的域名和完整的Internet服務器(支持WWW,FTP,E-mail等)。3. 一臺服務器上的不同虛擬主機是各自獨…

VMware配置額外內存設置

配置額外內存設置 額外內存設置用于控制主機系統中的內存管理器如何將虛擬機從物理 RAM 中換出。 要配置額外內存設置,請選擇[編輯] > [首選項] > [內存]。 [調整所有虛擬機內存使其適應預留的主機 RAM] 選擇此選項會對給定時間內可以運行的虛擬機的數量和內…

Kafka.net使用編程入門(一)

最近研究分布式消息隊列,分享下! 首先zookeeper 和 kafka 壓縮包 解壓 并配置好! 我本機zookeeper環境配置如下: D:\Worksoftware\ApacheZookeeper3\conf\zoo.cfg 以下是kafka的配置 D:\Worksoftware\Apachekafka2.11\config\server.propert…

下拉推廣系統立擇火星推薦_下拉詞刪除都擇火星下拉

會員注冊發帖做推廣的人都離不開搜索引擎,就像魚離不開水,很多時候我們做SEO的朋友都在研究各大搜索引擎的機制,收錄,排名規則或者是黑帽技術,不管如何,只是希望把自己的企業,產品,服…

python包路徑有幾個_python的搜索路徑與包(package)

python的搜索路徑其實是一個列表,它是指導入模塊時,python會自動去找搜索這個列表當中的路徑,如果路徑中存在要導入的模塊文件則導入成功,否則導入失敗: >>> importsys>>>sys.path [, C:\\Python33\…

配置文件管理服務器,06-配置文件管理

1配置文件管理設備運行于FIPS模式時,本特性部分配置相對于非FIPS模式有所變化,具體差異請見本文相關描述。有關FIPS模式的詳細介紹請參見“安全配置指導”中的“FIPS”。1.1 配置文件簡介配置文件是用來保存配置的文件。配置文件主要用于: …

虛擬機安裝spark配置推薦

如果虛擬機配置的內存太少,spark運行計算的時候會報: WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster uito ensure that workers are registered and have sufficient memory 資源不足的問題,導…

c++輸入一個整數判斷是否為完全平方數_matlab判斷一個整數是完全平方數

(C語言c)判斷一個數是否是 完全平方數的 整數倍#include#includeint ispow(int x){ int&用c編判斷一個數是否是完全數#include#includeintmain(){intn;printf("請輸入一個數,然后按回車鍵:\n");scanf("%d",&n);inti,p1;for(i2;i*i編…

Linux常用命令——chattr、lsattr

chattr 改變文件的擴展屬性 語法格式:chattr 【option】【mode】【files】chattr [選項] [模式] [文件或目錄]注意:chattr 命令及后面的選項和文件里,每個元素之間都要至少要有一個空格參數選項: 參數選項解釋說明-a只能向文件中…

兩個相鄰盒子的邊框怎么只顯示一個_【前端小課堂】0044 盒子

這是一個面向零基礎的前端教程,很簡單,用零散時間就可以學習。 推薦早上讀一下,晚上復習一下,如果可以奢侈一點,白天稍微練習一下下,總共花費 5~15 分鐘。就醬!已經好幾次提到塊(block)元素了&a…

scala apply方法 筆記

原文出處:http://blog.csdn.net/pzw_0612/article/details/48576569 ----------------------------------------------------- Scala比Java更面向對象的一個方面是Scala沒有靜態成員。替代品是,Scala有單例對象:singleton object。 當單例對…

轉:6.1海量數據處理

本文轉自看云,原文地址請移步:https://www.kancloud.cn/kancloud/the-art-of-programming/41608 偶然閑游,偶遇某一站點,發現這里寫的關于海量數據處理相關的思路還挺不錯,所以在這里采摘收藏,如有侵權之處還請評論區或…

python爬去中國天氣網_python爬取中國天氣網并展示最低溫度

import requestsfrom bs4 import BeautifulSoupimport lxmlimport jsonfrom echarts import Echart,Bar,Axisimport time#城市與溫度的集合weather_list []#城市集合city_list []#溫蒂集合lowest_list []#獲取溫度def getTemperature(url):result requests.get(url)#print r…

flash一個按鈕控制動畫_flutter閃屏過渡動畫,閃光占位動畫

在程序設計的理念中,講究一切都來源于物理世界,在現實世界中,人們在每接觸到一個新的事物或者說在手指觸碰到一個事物時,總是心里默許期望有一個反饋效果,這就是來源于心底深處常常被人忽略的一個潛在期望。在程序的世…

scala-wordcount

/* * Mapreduce步驟 * 1、map&#xff1a;獲取一行 * 2、按空格分隔 * 3、每個單詞統計&#xff0c;<key,1> 輸出到 reducer * 4、reducer <key,{1,1,1,1,1}> 匯總 * 5、輸出結果 */ 1、聲明一個集合&#xff0c;模仿要統計的…

動態改變_Excel中如何動態改變可編輯區域?

有這樣一個工作場景&#xff1a;我們制作一個工作報表模板給同事填寫數據&#xff0c;這個工作表格只可以在預設的可編輯區域編輯&#xff0c;其它都是受密碼保護的&#xff0c;而且這個可編輯區域是隨著日期——工作周的變化而發生變化的。也就是說在不同的工作周可編輯的區域…

java集合框架之ArrayList與LinkedList的區別

參考http://how2j.cn/k/collection/collection-arraylist-vs-linkedlist/690.html#nowhere ArrayList和LinkedList的區別 ArrayList 插入&#xff0c;刪除數據慢LinkedList&#xff0c; 插入&#xff0c;刪除數據快ArrayList是順序結構&#xff0c;所以定位很快&#xff0c;指哪…