當前位置:首頁 » 編程軟體 » shell編程應用

shell編程應用

發布時間: 2024-04-09 04:44:42

❶ 璇烽棶shell緙栫▼鏄浠涔璇烽珮鎵嬫寚鐐

shell鏄涓涓鍛戒護澶勭悊鍣錛坈ommandprocessor錛夆斺旀槸涓涓璇誨叆騫惰В閲婁綘杈撳叆鐨勫懡浠ょ殑紼嬪簭銆傞櫎浜嗘槸涓涓鍛戒護涓鏂鍣ㄤ互澶栵紝shell榪樻槸涓涓紼嬪簭璁捐¤璦銆備綘鍙浠ョ紪鍐檚hell鍙浠ヨВ閲婄殑紼嬪簭錛堣縐頒負婧愮▼搴忥級錛岃繖浜涙簮紼嬪簭鍙浠ュ寘鍚玸hell紼嬪簭璁捐″懡浠ょ瓑絳夈俿hell闄や簡瑙i噴鍛戒護浠ュ栵紝榪樻湁鍏朵粬宸ヤ綔錛屽畠涔熷彲浠ラ厤緗鍜岀紪紼嬨俿hell鎷ユ湁鑷宸辯殑璇璦鍏佽哥敤鎴風紪鍐欑▼搴忓苟浠ヤ竴縐嶅嶆潅鏂瑰紡榪愯屻俿hell緙栫▼璇璦鍏鋒湁璁稿氬父鐢ㄧ殑緙栫▼璇璦鐨勭壒寰侊紝渚嬪傦細寰鐜鍜屾帶鍒剁粨鏋勭瓑銆傜敤鎴峰彲浠ョ敓鎴愬儚鍏朵粬搴旂敤紼嬪簭涓鏍峰嶆潅鐨剆hell紼嬪簭銆

琛ュ厖璇存槑錛氱畝鍗曠殑璇達細shell鏄涓涓浜や簰鎬у懡浠よВ閲婂櫒銆俿hell鐙絝嬩簬鎿嶄綔緋葷粺錛岃繖縐嶈捐¤╃敤鎴峰彲浠ョ伒媧婚夋嫨閫傚悎鑷宸辯殑shell銆俿hell璁╀綘鍦ㄥ懡浠よ岄敭鍏ュ懡浠わ紝緇忚繃shell瑙i噴鍚庝紶閫佺粰鎿嶄綔緋葷粺錛堝唴鏍革級鎵ц屻

浠ヤ笅鏄痵hell鍔熻兘鐨勪竴涓奼囨伙細

鏌ユ壘鍛戒護鐨勪綅緗騫朵笖鎵ц岀浉鍏寵仈鐨勭▼搴忋

涓簊hell鍙橀噺璧嬫柊鍊

鎵ц屽懡浠ゆ浛浠

澶勭悊I/O閲嶅畾鍚戝拰綆¢亾鍔熻兘

鎻愪緵涓涓瑙i噴鎬х殑緙栫▼璇璦鐣岄潰錛屽寘鎷瑃ests銆乥ranches鍜宭oops絳夎鍙

❷ 如何使用linux shell編程來進行系統管理和網路管理

從程序員的角度來看, Shell本身是一種用C語言編寫的程序,從用戶的角度來看,Shell是用戶與Linux操作系統溝通的橋梁。用戶既可以輸入命令執行,又可以利用 Shell腳本編程,完成更加復雜的操作。在Linux GUI日益完善的今天,在系統管理等領域,Shell編程仍然起著不可忽視的作用。深入地了解和熟練地掌握Shell編程,是每一個Linux用戶的必修 功課之一。
Linux的Shell種類眾多,常見的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell語言的語法有所不同,所以不能交換使用。每種Shell都有其特色之處,基本上,掌握其中任何一種 就足夠了。在本文中,我們關注的重點是Bash,也就是Bourne Again Shell,由於易用和免費,Bash在日常工作中被廣泛使用;同時,Bash也是大多數Linux系統默認的Shell。在一般情況下,人們並不區分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。
利用vi等文本編輯器編寫Shell腳本的格式是固定的,如下:
#!/bin/sh
#comments
Your commands go here
首行中的符號#!告訴系統其後路徑所指定的程序即是解釋此腳本文件的Shell程 序。如果首行沒有這句話,在執行腳本文件的時候,將會出現錯誤。後續的部分就是主程序,Shell腳本像高級語言一樣,也有變數賦值,也有控制語句。除第 一行外,以#開頭的行就是注釋行,直到此行的結束。如果一行未完成,可以在行尾加上",這個符號表明下一行與此行會合並為同一行。
編輯完畢,將腳本存檔為filename.sh,文件名後綴sh表明這是一個Bash腳本文件。執行腳本的時候,要先將腳本文件的屬性改為可執行的:
chmod +x filename.sh
執行腳本的方法是:
./filename.sh
下面我們從經典的「hello world」入手,看一看最簡單的Shell腳本的模樣。
#!/bin/sh
#print hello world in the console window
a = "hello world"
echo $a
Shell Script是一種弱類型語言,使用變數的時候無需首先聲明其類型。新的變數會在本地數據區分配內存進行存儲,這個變數歸當前的Shell所有,任何子進 程都不能訪問本地變數。這些變數與環境變數不同,環境變數被存儲在另一內存區,叫做用戶環境區,這塊內存中的變數可以被子進程訪問。變數賦值的方式是:
variable_name = variable_value
如果對一個已經有值的變數賦值,新值將取代舊值。取值的時候要在變數名前加$,$variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的。如果出現混淆的情況,可以使用花括弧來區分,例如:
echo "Hi, $as"
就不會輸出「Hi, hello worlds」,而是輸出「Hi,」。這是因為Shell把$as當成一個變數,而$as未被賦值,其值為空。正確的方法是:
echo "Hi, ${a}s"
單引號中的變數不會進行變數替換操作。

關於變數,還需要知道幾個與其相關的Linux命令。
env用於顯示用戶環境區中的變數及其取值;set用於顯示本地數據區和用戶環境區中的變數及其取值;unset用於刪除指定變數當前的取值,該值將被指定為NULL;export命令用於將本地數據區中的變數轉移到用戶環境區。
下面我們來看一個更復雜的例子,結合這個例子,我們來講述Shell Script的語法。

1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if [ $# -lt 3 ]; then
4 cat<<HELP
5 ren -- renames a number of files using sed regular expressions
6
7 USAGE: ren 'regexp' 'replacement' files
8 EXAMPLE: rename all *.HTM files in *.html:
9 ren 'HTM$' 'html' *.HTM
10
11 HELP
12 exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if [ -f "$file" ]; then
23 newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
24 if [ -f "$newfile" ]; then
25 echo "ERROR: $newfile exists already"
26 else
27 echo "renaming $file to $newfile "
28 mv "$file" "$newfile"
29 fi
30 fi
31 done

我們從頭來看,前面兩行上一個例子中已經解釋過了,從第三行開始,有新的內容。if語句和其他編程語言相似,都是流程式控制制語句。它的語法是:
if …; then

elif …; then

else

fi
與其他語言不同,Shell Script中if語句的條件部分要以分號來分隔。第三行中的[]表示條件測試,常用的條件測試有下面幾種:
[ -f "$file" ] 判斷$file是否是一個文件
[ $a -lt 3 ] 判斷$a的值是否小於3,同樣-gt和-le分別表示大於或小於等於
[ -x "$file" ] 判斷$file是否存在且有可執行許可權,同樣-r測試文件可讀性
[ -n "$a" ] 判斷變數$a是否有值,測試空串用-z
[ "$a" = "$b" ] 判斷$a和$b的取值是否相等
[ cond1 -a cond2 ] 判斷cond1和cond2是否同時成立,-o表示cond1和cond2有一成立
要注意條件測試部分中的空格。在方括弧的兩側都有空格,在-f、-lt、=等符號兩側同樣也有空格。如果沒有這些空格,Shell解釋腳本的時候就會出錯。
$#表示包括$0在內的命令行參數的個數。在Shell中,腳本名稱本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整個參數列表,不包括$0,也就是說不包括文件名的參數列表。
現在我們明白第三行的含義是如果腳本文件的參數少於三個,則執行if和fi語句之間 的內容。然後,從第四行到第十一行之間的內容在Shell Script編程中被稱為Here文檔,Here文檔用於將多行文本傳遞給某一命令。Here文檔的格式是以<<開始,後跟一個字元串,在 Here文檔結束的時候,這個字元串同樣也要出現,表示文檔結束。在本例中,Here文檔被輸出給cat命令,也即將文檔內容列印在屏幕上,起到顯示幫助 信息的作用。
第十二行的exit是Linux的命令,表示退出當前進程。在Shell腳本中可以使用所有的Linux命令,利用上面的cat和exit,從一方面來說,熟練使用Linux命令也可以大大減少Shell腳本的長度。
十四、十五兩句是賦值語句,分別將第一和第二參數賦值給變數OLD和NEW。緊接下來的兩句是注釋,注釋下面的兩條shift的作用是將參數列表中的第一個和第二個參數刪除,後面的參數依次變為新的第一和第二參數,注意參數列表原本也不包括$0。
然後,自二十一行到三十一行是一個循環語句。Shell Script中的循環有下面幾種格式:
while [ cond1 ] && { || } [ cond2 ] …; do

done
for var in …; do

done
for (( cond1; cond2; cond3 )) do

done
until [ cond1 ] && { || } [ cond2 ] …; do

done
在上面這些循環中,也可以使用類似C語言中的break和continue語句中斷 當前的循環操作。第二十一行的循環是將參數列表中的參數一個一個地放入變數file中。然後進入循環,判斷file是否為一個文件,如果是文件的話,則用 sed命令搜索和生成新的文件名。sed基本上可以看成一個查找替換程序,從標准輸入,例如管道讀入文本,並將結果輸出到標准輸出,sed使用正則表達式 進行搜索。在第二十三行中,backtick(`)的作用是取出兩個backtick之間的命令輸出結果,在這里,也就是將結果取出賦給變數 newfile。此後,判斷newfile是否已經存在,否則就把file改成newfile。這樣我們就明白這個腳本的作用了,Shell Script編寫的其他腳本與此相似,只不過是語法和用法稍有不同而已。
通過這個例子我們明白了Shell Script的編寫規則,但還有幾件事情需要講述一下。
第一個,除了if語句之外,Shell Script中也有類似C語言中多分支結構的case語句,它的語法是:
case var in
pattern 1 )
… ;;
pattern 2 )
… ;;
*)
… ;;
esac

我們再就下面一個例子,看看case語句的用法。
while getopts vc: OPTION
do
case $OPTION in
c) COPIES=$OPTARG
ehco "$COPIES";;
v) echo "suyang";;
\?) exit 1;;
esac
done
上面的getopts類似於C語言提供的函數getopts,在Shell Script中,getopts經常和while語句聯合起來使用。getopts的語法如下:
getopts option_string variable
option_string中包含一串單字元選項,若getopts在命令行參數中 發現了連字元,那麼它會將連字元之後的字元與option_string進行比較,若匹配成功,則把變數variable的值設為該選項,若無匹配,則把 變數的值設為?。有時候,選項還會帶一個值,例如-c5等,這時要在option_string中該選項字母後面加上一個冒號,getopts發現冒號 後,會讀取該值,然後將該值放入特殊變數OPTARG中。這個命令比較復雜,如有需要,讀者可以詳細參閱Shell編寫的相關資料。
上面這個循環的作用就是依次取出腳本名稱後面的選項,進行處理,如果輸入了非法選項,則進入"?指定的部分,退出腳本程序。
第二個,Bash提供了一種用於互動式應用的擴展select,用戶可以從一組不同的值中進行選擇。其語法如下:
select var in …; do
break;
done
例如,下面這段程序的輸出是:
#!/bin/bash
echo "Your choice?"
select var in "a" "b" "c"; do
break
done
echo $var
----------------------------
Your choice?
1) a
2) b
3) c
第三,Shell Script中也可以使用自定義的函數,其語法形式如下:
functionname()
{

}
例如我們可以把上面第二個例子中第四到第十二行放入一個名為help函數體內,以後每次調用的時候直接寫help即可。函數中處理函數調用參數的方法是,直接用上面講過的$1、$2來分別表示第一、第二個參數,用$*表示參數列表。
第四,我們也可以在Shell下調試Shell Script腳本,當然最簡單的方法就是用echo輸出查看變數取值了。Bash也提供了真正的調試方法,就是執行腳本的時候用-x參數。
sh ?x filename.sh
這會執行腳本並顯示腳本中所有變數的取值,也可以使用參數-n,它並不執行腳本,只是返回所有的語法錯誤。

❸ 請問下,學習SHELL編程的主要用途是什麼。

shell 是操作系統的最外層。shell 合並編程語言以控制進程和文件,以及啟動和控制其它程序。shell 通過提示您輸入,向操作系統解釋該輸入,然後處理來自操作系統的任何結果輸出來管理您與操作系統之間的交互。shell編程可以進行一些批量重復性的工作,從而提高工作效率。

❹ Linux Shell 教程——想玩轉linux就請一直看下去

Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。

Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。

Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形界面 Shell。

Shell 在線工具

Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。

業界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。

由於習慣的原因,簡潔起見,本文出現的 "shell編程" 都是指 shell 腳本編程,不是指開發 shell 自身。

Shell 編程跟 JavaScript、php 編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了。

Linux 的 Shell 種類眾多,常見的有:

在一般情況下,人們並不區分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh ,它同樣也可以改為 #!/bin/bash

#! 告訴系統其後路徑所指定的程序即是解釋此腳本文件的 Shell 程序。

打開文本編輯器(可以使用 vi/vim 命令來創建文件),新建一個文件 test.sh,擴展名為 sh(sh代表shell),擴展名並不影響腳本執行,見名知意就好,如果你用 php 寫 shell 腳本,擴展名就用 php 好了。

輸入一些代碼,第一行一般是這樣:

#!/bin/bash
echo "Hello World !"


運行實例 »

#! 是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell。

echo 命令用於向窗口輸出文本。

1、作為可執行程序

將上面的代碼保存為 test.sh,並 cd 到相應目錄:

注意,一定要寫成 ./test.sh ,而不是 test.sh ,運行其它二進制的程序也一樣,直接寫 test.sh,linux 系統會去 PATH 里尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的當前目錄通常不在 PATH 里,所以寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。

2、作為解釋器參數

這種運行方式是,直接運行解釋器,其參數就是 shell 腳本的文件名,如:

這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。

❺ Linux中Shell編程在工作中有沒用

以上程序有如下幾點錯誤:
1,!書寫錯誤。應該改成英文的嘆號。
2,tcsh中while的語法錯誤。以上的while寫法是sh/bash中while的用法。對於csh/tcsh中while的用法應該為while(expression)
do
something
end
3,為變數賦值錯誤。read
name也是sh/bash中為變數賦值的方法,在csh/tcsh中應該改為:
set
name
=
$<
4,判斷是否相等錯誤。應該改為==
最終修改的代碼為:
#!/bin/tcsh
set
again=yes
while
(
$again
==
"yes"
)
echo
-n
"input
your
name:"
set
name
=
$<
echo
"your
name
is
$name"
echo
-n
"do
you
want
to
continue
again?"
end

❻ Linux Shell 腳本編程最佳實踐

IT路邊社

前言

與其它的編碼規范一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時也討論一些約定及編碼標准。這份文檔主要側重於我們所普遍遵循的規則,對於那些不是明確強制要求的,我們盡量避免提供意見。

編碼規范對於程序員而言尤為重要,有以下幾個原因:

本文檔中的准則致力於最大限度達到以下原則:

盡管本文檔涵蓋了許多基礎知識,但應注意的是,沒有編碼規范可以為我們回答所有問題,開發人員始終需要再編寫完代碼後,對上述原則做出正確的判斷。

:未明確指明的則默認為必須(Mandatory)

主要參考如下文檔:

僅建議Shell用作相對簡單的實用工具或者包裝腳本。因此單個shell腳本內容不宜太過復雜。

在選擇何時使用shell腳本時時應遵循以下原則:

可執行文件不建議有擴展名,庫文件必須使用 .sh 作為擴展名,且應是不可執行的。

執行一個程序時,無需知道其編寫語言,且shell腳本並不要求具有擴展名,所以更傾向可執行文件沒有擴展名。

而庫文件知道其編寫語言十分重要,使用 .sh 作為特定語言後綴的擴展名,可以和其他語言編寫的庫文件加以區分。

文件名要求全部小寫, 可以包含下劃線 _ 或連字元 - , 建議可執行文件使用連字元,庫文件使用下劃線。

正例:

反例:

源文件編碼格式為UTF-8。避免不同操作系統對文件換行處理的方式不同,一律使用 LF 。

每行最多不超過120個字元。每行代碼最大長度限制的根本原因是過長的行會導致閱讀障礙,使得縮進失效。

除了以下兩種情況例外:

如出現長度必須超過120個字元的字元串,應盡量使用here document或者嵌入的換行符等合適的方法使其變短。

示例:

除了在行結束使用換行符,空格是源文件中唯一允許出現的空白字元。

對從來沒有用到的或者被注釋的方法、變數等要堅決從代碼中清理出去,避免過多垃圾造成干擾。

Bash 是唯一被允許使用的可執行腳本shell。

可執行文件必須以 #!/bin/bash 開始。請使用 set 來設置shell的選項,使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數及路徑不需要引號 grep -li Hugo /dev/ "$1"
# 示例8:常規變數用雙引號,ccs可能為空的特殊情況可不用引號 git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號,$1可能為空的特殊情況可不用引號 grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數傳遞推薦帶引號的"$@",所有參數作為單字元串傳遞用帶引號的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當執行 ./t.sh a b c 時輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:

使用 $(command) 而不是反引號。

因反引號如果要嵌套則要求用反斜杠轉義內部的反引號。而 $(command) 形式的嵌套無需轉義,且可讀性更高。

正例:

反例:

條件測試

使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。

因為在 [[ 和 ]] 之間不會出現路徑擴展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯。且 [[ ... ]] 支持正則表達式匹配,而 [ ... ] 不支持。參考以下示例:

盡可能使用變數引用,而非字元串過濾。

Bash可以很好的處理空字元串測試,請使用空/非空字元串測試方法,而不是過濾字元,讓代碼具有更高的可讀性。正例:

反例:

正例:

反例:

正例:

反例:

文件名擴展

當進行文件名的通配符擴展時,請指定明確的路徑。

當目錄中有特殊文件名如以 - 開頭的文件時,使用帶路徑的擴展通配符 ./* 比不帶路徑的 * 要安全很多。

應該避免使用eval。

Eval在用於分配變數時會修改輸入內容,但設置變數的同時並不能檢查這些變數是什麼。反例:

請使用進程替換或者for循環,而不是通過管道連接while循環。

這是因為在管道之後的while循環中,命令是在一個子shell中運行的,因此對變數的修改是不能傳遞給父shell的。

這種管道連接while循環中的隱式子shell使得bug定位非常困難。反例:

如果你確定輸入中不包含空格或者其他特殊符號(通常不是來自用戶輸入),則可以用for循環代替。例如:

使用進程替換可實現重定向輸出,但是請將命令放入顯式子 shell,而非 while 循環創建的隱式子 shell。例如:

總是檢查返回值,且提供有用的返回值。

對於非管道命令,使用 $? 或直接通過 if 語句來檢查以保持其簡潔。

例如:

當內建命令可以完成相同的任務時,在shell內建命令和調用外部命令之間,應盡量選擇內建命令。

因內建命令相比外部命令而言會產生更少的依賴,且多數情況調用內建命令比調用外部命令可以獲得更好的性能(通常外部命令會產生額外的進程開銷)。

正例:

反例:

載入外部庫文件不建議用使用.,建議使用source,已提升可閱讀性。正例:

反例:

除非必要情況,盡量使用單個命令及其參數組合來完成一項任務,而非多個命令加上管道的不必要組合。常見的不建議的用法例如:cat和grep連用過濾字元串; cat和wc連用統計行數; grep和wc連用統計行數等。

正例:

除特殊情況外,幾乎所有函數都不應該使用exit直接退出腳本,而應該使用return進行返回,以便後續邏輯中可以對錯誤進行處理。正例:

反例:

推薦以下工具幫助我們進行代碼的規范:

原文鏈接:http://itxx00.github.io/blog/2020/01/03/shell-standards/

獲取更多的面試題、腳本等運維資料點擊: 運維知識社區 獲取

腳本之---簡訊轟炸機

腳本之---QQ微信轟炸機

ansible---一鍵搭建redis5.0.5集群

elk7.9真集群docker部署文檔

全球最全loki部署及配置文檔

最強安全加固腳本2.0

一鍵設置iptbales腳本

熱點內容
python更改目錄 發布:2024-11-15 08:41:08 瀏覽:264
伺服器快閃記憶體可以裝在一般電腦上嗎 發布:2024-11-15 08:36:46 瀏覽:7
安卓手機怎麼查詢自己的路線軌跡 發布:2024-11-15 08:32:19 瀏覽:968
phpdatet 發布:2024-11-15 08:32:17 瀏覽:506
HDB3編解碼實驗 發布:2024-11-15 08:17:31 瀏覽:211
怪星球編程 發布:2024-11-15 08:15:55 瀏覽:843
慧編程價格 發布:2024-11-15 08:14:09 瀏覽:458
python多行注釋的快捷鍵 發布:2024-11-15 08:09:14 瀏覽:956
c1腳本病毒 發布:2024-11-15 07:59:04 瀏覽:611
為什麼淘寶上的阿里雲伺服器便宜 發布:2024-11-15 07:58:49 瀏覽:547