




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Shell腳本入門,什么是shell?,命令解釋器俗稱外殼程序 用戶通過shell向kernel發送指令,kernel再向硬件發送指令 Shell版本眾多,例如常聽到的 Bourne Shell (sh) 、在Sun中默認的C Shell、 商業上常用的K SHell以及TCSH 等,每一種Shell都各有其特點。 Linux 使用的是Bourne Again Shell(簡稱 bash),這個 Shell是Bourne Shell的增強版本,是基于GNU的架構下發展出來的。,Bash shell特點,命令補全補全功能 如果在執行命令的時候不想按下太多的按鍵(例如命令pcprofiledump
2、),在輸入了 pcprofile 之后,再按下 Tab 鍵的話,那么 bash 馬上會自動的將后面的dump接上來。 如果有重復的命令,那么按下兩次 Tab 將會把所有重復的命令列出來。 直接在提示字符后面連按兩次 鍵,則系統會將所有可以使用的命令都列出來。 例如,如果想要知道目前系統里面,所有以b開頭的命令呢?就是按下 b 之后,連按兩次就ok。,Bash shell特點,文件名稱補全功能 如果用 vim 來讀取某個文件,例如 /etc/man.config 這個文件,那么可以輸入 vim /etc/man之后,直接按下 鍵,該文件名稱就會被自動的補上。 同樣,出現文件多個匹配項時,可以按下
3、兩個TAB鍵來顯示所有匹配項。 這樣大大增加了指令輸入的正確率。,Bash shell特點,命令記憶能力 Linux可以記憶以前輸入過的命令,只要使用上下鍵就可以找到以前執行的指令來執行。 這些命令按照先后順序記錄在用戶Home目錄下的隱藏文件.bash_history中 .bash_history里面記錄了這一次登錄以前執行過的命令,本次登錄執行的命令都保存在內存中,只有成功注銷之后,內存數據才會刷新到.bash_history文件中 有時候.bash_history文件中記錄了你包含在指令中的密碼,可能引起安全問題,所以最好還是設置命令的記錄數量不要太大。,Bash shell特點,命令名
4、稱: history 用法:history number 顯示最近 number個命令,不指定number則選擇全部。 執行歷史命令: 方法1:!number 執行歷史命令中編號為number的那個命令 方法2:!command 執行歷史命令中最近一次以command開頭的命令,命令無須打全,只要匹配前面幾個字符即可。 方法3:! 執行上一條命令,Bash shell特點,命令別名設置功能 假如我需要知道某個目錄底下的所有文件信息(包含隱藏文件)及所有的文件屬性,那么我就必須要輸入ls -al 這樣的指令。 每次都輸入多麻煩! 可以通過為自己經常使用的命令(包括參數)定義別名來避免過多輸入。
5、例如:alias lm=ls -al (注意=兩邊不要有空格) 那么以后lm就等于執行ls -al 直接輸入alias,可以顯示目前以及定義好的所有別名,編譯型語言和腳本編程語言,許多大中型程序是用編譯型語言寫的,例如:C/C+/java。這類程序只要從源代碼轉換成目標代碼,就能直接在計算機上執行。(java類似。它是轉換成字節碼,在java虛擬機上執行) 編譯型語言的好處是效率高,它的二進制代碼可直接被cpu執行。缺點是它們直接處理的是字節、整數、浮點數等機器層的對象。例如,C+很難進行“將一個目錄內的所有文件復制到另一個目錄”這樣簡單的操作。 腳本編程語言通常是解釋型的語言,這類程序的執行
6、是由解釋器讀入程序代碼,并將其轉換成內部的形式,再執行。這類語言有awk、perl、python、javascript、Ruby和shell。用腳本編程語言寫的程序代碼,稱為腳本程序。 腳本編程語言的好處是,它多半運行在比編譯器還高的層級,能輕易處理文件和目錄之類的對象。缺點是:它的效率通常不如編譯型語言高。它們并不能直接被cpu執行,執行時還需要進行轉換。,SHELL腳本的優點,shell腳本常用于系統管理工作,或是結合現有的程序以完成小型的、特定的工作。通過把工作用到的命令串起來,放進一個獨立的腳本中,以后只要執行該程序就能完成工作了。 shell是各類unix版本的通用功能,且經過了PO
7、SIX的標準化。一個編寫良好的shell腳本,可以應用到多個系統上。因此之所以使用shell腳本是基于: 簡單性:shell是一個高級語言;通過它可以簡潔地表達復雜的操作。 可移植性:使用POSIX所定義的功能,可以做到腳本無需修改就可在不同的類unix系統上運行。 開發容易:可以在較短時間內完成一個功能強大又好用的腳本。,SHELL腳本的格式,命令從上向下,從左向右 地分析和執行,如果讀到一個 回車鍵,就嘗試開始執行該行。 右圖是一個shell腳本 第一行#!/bin/bash指明這個 腳本使用的解釋器是bash,腳本 的語法是用bash的語法。例如perl腳本的第一行是#!/usr/bin
8、/perl shell腳本用#號作為一行注釋開始。#到行尾之間的內容被視為注釋 接下來就是程序部分 告知執行的成功與否可以用命令exit 來結束腳本的執行,并且傳回一個數值給系統。將來可以用$?來獲取它傳回的值。 大家猜一下返回值的范圍是多少 ,怎么驗證?,rootlocalhost # cat helloworld.sh #!/bin/bash #my first shell script #history: 2012.01.01 echo “hello world” exit 0,Shell腳本執行方式一,父進程創建一個子進程,在子進程里運行命令解釋器,由解釋器讀取腳本并執行相應的功能。
9、假設寫完一個腳本文件/home/jim/123.sh后,該如何執行呢? 有以下幾種方式: 以bash進程來執行:通過“bash 123.sh” 來執行。 直接命令執行:123.sh文件必須要具備可讀與可執行權限: 絕對路徑:使用/home/jim/123.sh來執行命令; 相對路徑:假設工作目錄在/home/jim/,這可以使用./123.sh來執行; 變量“PATH”功能:將123.sh放在PATH指定的目錄下,例如:放在/bin/里,則可直接通過文件名123.sh來執行。,Shell環境變量,環境變量的形式通常如:name=value Linux內核并不查看這些字符串,他們的解釋完全依賴于
10、各個應用程序。例如,shell就使用了大量的環境變量,其中一些在登錄時自動設置,如HOME和USER等,有些則由用戶設置。 功能:我們在shell中設置環境變量以控制shell的動作。例如設置了MAIL就告訴shell應該到哪里去取郵件。 顯示變量值的命令:echo 用法:echo $variable 例如:在環境變量前加上$就代表使用該變量的值 echo $PATH echo $HOME 查看當前所有Linux環境變量的命令:env,Shell配置文件,shell在啟動時會讀取一些配置文件。下面是bash的配置文件,實際上他們也是shell腳本。/etc目錄下的是系統級的配置文件,用戶家目錄
11、下的兩個配置文件是用戶的個性化。 /etc/profile 設置系統級的環境變量 PATH、HOME、HISTSIZE等。第一次登錄時運行該腳本。 /.bash_profile 用戶可在這里設置環境變量或啟動程序。當用戶登錄時,該文件僅僅執行一次 。 /.bashrc 用戶可在這里設定別名和函數。啟動shell時都會執行該配置文件。 /etc/bashrc 啟動shell時運行該腳本。 /.bash_logout 退出shell時執行。,根據啟動shell的方式不同,配置好腳本的執行也有不同: 對于login shell:即通過輸入用戶名和密碼登陸或用su - 獲得的shell。在shell啟
12、動時會按14的順序依次執行這四個配置腳本。這時獲得的是一個完全和用戶名相符的shell環境。對于non-login shell:不需登錄流程或以su的方式切換用戶獲得的shell。這種情況下,啟動shell時只執行和兩個配置腳本。例如,圖形界面下啟動一個終端,或者在原來的bash環境下再輸入bash,都不需要用戶名和密碼;這兩次獲得的shell就稱為non-login shell。這時許多環境還未改變。比如PATH,因為它是在和中設置的。,變量類型,變量是用一固定的字符串或符號來表示一個可變的值。和C語言中相似。有以下幾種變量: 用戶自定義變量 位置變量 預定義的特殊變量 環境變量(expor
13、t),用戶自定義變量,變量無須事先聲明 變量的可以用字符(a-z A-z)數字和下劃線組成,但必須以字符開頭。 變量與變量內容(值)用等號連接,等號左右不能有空格,對變量賦值 #a=“hello shell” 打印變量 #echo $a,變量引用,$加變量名即可引用該變量的值。例如:$var 使用 可以使變量名和后續字母分開。例如: var=de $varabc的值為deabc $varabc是取變量varabc的值,若之前沒有創建過varabc那么它的值為空 未定義的變量值為空,Shell變量賦值,雙引號內的字符如 $ ” 等以特殊字符解讀。 單引號內的特殊字符全部當做普通字符處理。,a=“
14、aa” b=“$a bb” c=$a cc echo $a echo $b echo $c,Shell變量賦值,把命令的執行結果賦值給變量(例如ls),用command,或$(command) 注意:是反引號(backquote), 不是單引號(quote),將ls的輸出結果作為變量a的值 #a=ls 等價于 a=$(ls) 打印變量 #echo $a,環境變量,環境變量是指能被子進程所繼承的變量。子進程只會繼承父進程的環境變量 (1)HOME:用戶主目錄的全路徑名。如/home/myname (2)LOGNAME:即用戶注冊名 (3)PWD:當前工作目錄的路徑。 (4)PATH:shell查
15、找命令的路徑(目錄)列表,各個目錄用冒號( : )隔開。 (5)PS1:shell的主提示符。 $ PS1=$LOGNAME (6)SHELL:當前使用的shell。通常,它的值是/bin/bash。 (7)TERM:終端類型。 可以用env命令列出當前環境下的所有環境變量及其值,也可用echo命令察看任何一個環境變量的值。 當更改了環境變量的值以后,往往利用export命令將這些變量輸出,使它們成為公用量。例如: $ export HOME PATH PS1 用戶自定義變量可以通過export命令,變成環境變量。例如: # asdf=1234 執行env,查看是否有變量asdf # expo
16、rt asdf 執行env ,查看是否有變量asdf,這一次asdf變成環境變量,shell腳本的執行方式二,bash進程本身就是個shell腳本解釋器,直接由該進程讀取shell腳本并執行。好處是:它的執行效果會在當前shell中生效。該方法是通過內置命令source或 . 實現的。 經常用在修改了的bash的配置文件在當前環境下生效,可以使用命令source 或“.”后接配置文件來執行配置腳本。 范例:在/.bashrc里設置了alias別名,想在當前環境立即可用 # vim /.bashrc 打開文件,在該文件寫入下面一行,保存并退出 alias hello=echo “welcome
17、today is $(date +%Y:%m:%d)” # source /.bashrc 或者 . /.bashrc 接下來就可以使用該別名了 在/.bash_profile里將當前用戶的家目錄加到PATH路徑中 # vim /.bash_profile 打開文件,寫入下面兩行,保存并退出 PATH=$PATH:$HOME export PATH #source /.bash_profile 或者 . /.bash_profile 接下來,直接輸入家目錄下的可執行程序的文件名就可以執行了。,預先定義的特殊變量,$當前進程的進程號。 $!上一個后臺命令對應的進程號。 $?上一條命令執行后的返回
18、碼,也稱退出碼。每條命令都有返回碼,0代表執行成功,當用于判斷式時,表達式為真,非零代表執行失敗,用于判斷式時,表達式為假。 $#除腳本名外,命令行上參數的個數。 $*表示在命令行上實際給出的所有實參。如輸入下面的命令行: exam3 A B C D E F G H I J K 則$* 是:A B C D E F G H I J K 而”$*”等價于: “$1 $2 $3”,即:”A B C D E F G H I J K” $它與$*基本功能相同。區別在于當用引號時 ”$”與”$*”不同,”$”參數是彼此分離的。 ”$”就等價于: $1 $2 在上面情況下, “$” 就是“A” “B” “C
19、”“K”,預先定義的特殊變量,變量名為0的值代表正在執行的腳本名稱 變量名為1到99的值代表命令行傳入的參數。 變量名大于10時,必須用括起來,例如取第十個參數用$10 輸入下面的命令行: # exam3 A B C D E F 那么 $0的值為exam3 $1到$6的值分別對應A到F 內置命令shift功能:造成參數變量號碼偏移 用法:shift n 例如:上面的輸入,執行命令 shift 3 之后,這些參數變量從第四個開始對應。 $1的值為D $2為E $3為F $4、$5、$6的值為空 直接shift等價于 shift 1,Shell算術運算,+ - * / % 分別對應加、減、乘、除、
20、取余 只需將特定的算術表達式用 “$(” 和 “)” 括起來。a=$(4-2) a的值為2,a=10 b=2 echo $($a+$b) echo $($a-$b) echo $($a*$b) echo $($a/$b) echo $($a%$b),跟用戶交互,用bash內嵌的read命令 功能:讀取來自鍵盤的輸入,并傳給變量 用法:read 選項 變量名 選項: -p 字符串 后面接字符串給出提示 -t 時間 后接等待的秒數,即不會一直等待用戶輸入,#echo “input your name” #read name 上面兩行可以用下面一行代替 #read -p “input your na
21、me” name #echo “my name is $name”,Shell邏輯判斷, then echo usage: command filename exit 1; fi if test -f $1; then echo file $1 exists! fi,#!/bin/bash $# != 1 then 動作 elif 表達式; then 動作 elif 表達式; then 動作 else 動作 fi,#!/bin/bash if $# != 1 ; then echo usage: command number exit 1; fi if $1 -lt 0 ; then echo
22、 $1 is less than 0 elif $1 -lt 10 ;then echo $1 is betwen 0 and 9 elif $1 -lt 100 ; then echo $1 is between 10 and 99 else echo $1 is great equal than 100 fi,這個程序用來展示測試語句應用,$ cat exam10 echo -n key in a number (1-10 ) : #提示輸入1-10之間的一個數字,光標不換行 read a #讀取輸入的數字 if $a -lt 1 -o $a -gt 10 #如果該數小于1或者大于10 t
23、hen echo Error Number . #顯示輸入數字有錯 exit 2 #退出,返回碼為2 elif ! $a -lt 5 #否則,若該數不小于5 then echo Its not less 5. #顯示不小于5 的信息 else echo Its less 5. #否則,顯示該數小于5 fi #結束if語句 echo accept key in value. #顯示接受了鍵入的值,動手小練習,提示用戶輸入一個數,判斷這個數是否是你想要的。想要的就打出 yes,否則就是no。 提示用戶輸入一個文件/目錄,判斷這個文件具有哪些屬性? 寫一個輸入新的文件名,就自動創建C源文件的腳本程序
24、,Shell分支判斷:case,分支判斷 用*代表所有其他值 case $變量名稱 in “第一個變量的內容”) 動作1 ; “第二個變量內容”) 動作2 ; *) 動作3 ; esac,#!/bin/bash if $# != 1 ; then echo usage: command number exit 1; fi case $1 in 2) echo you input number 2 ; 4) echo you input number 4 ; 6) echo you input number 6 ; *) echo invalid input esac,動手練習,提示用戶輸入一字
25、符串,字符串必須為 “case”或者”esac” ,并打印出來。如果輸入的是其他字符串打印出錯消息。,Shell循環:for,For循環三種方式: 1、像C語言一樣使用,適合數值運算 for(語句;條件;語句) do 動作 done 2、for 變量名 in 變量值1 變量值2 do 動作 done 3、for 變量名 in $var do 動作 done,#!/bin/bash if $# != 1 ;then echo usage: $0 loop_number exit 1 fi sum=0 for(i=0;i$1;i+) do sum=$($sum+$i) done echo “sum
26、 is $sum”,sum=0 for i in abc def mnq do echo $i done,For循環小練習,系統上面的各種賬號都是寫在/etc/passwd 內的第一個字段,你能不能通過命令cut找出每個賬號的名稱,用命令id、finger 輸出他們的相關信息呢? 請寫一個程序將/etc/passwd 的賬號取出,而且每一個賬號都以一行字符串The 1 account is “root” 來顯示,那個 1 表示行數,雙引號里是賬號名。 若想讓用戶輸入一個目錄名, 然后我找出該目錄內的每個文件的讀寫執行權限,該如何做? 讓用戶輸入一個大于0的數字,程序可以由 1+2+3. 一直累
27、加到用戶輸入的數字為止,輸出結果。 輸出命令行參數,每行列出一個參數。演示$*和$的區別,Shell循環:while,一、 while 表達式 do 動作 done 二、 until 表達式 do 動作 done,下面是計算1到loop的和 #!/bin/bash if $# != 1 ;then echo input number exit 1 fi sum=0; loop=$1 while $loop -gt 0 do sum=$($sum+$loop) loop=$($loop-1) done echo sum is $sum,until $a = 0 do echo $a; a=$($
28、a-1); done,break/continue,Break n 跳出最近的n重循環,默認跳出最近的一重循環 continue 繼續循環 練習: 寫一個腳本,輸出所有的命令行參數。要求:每行輸出一個參數,分別用for和while實現。 幫用戶找到/usr/目錄下文件名以.d為后綴的文件,并將這些文件都拷貝到目標目錄下。若找到的文件本身為目錄,則不拷貝。,腳本調試,bash -nvx script 參數說明 -n 不執行腳本,只檢查腳本的語法,若沒有語法錯誤,則不會顯示任何信息 -v 執行腳本前,把每行腳本都輸入到屏幕 -x 執行腳本,顯示腳本每一行腳本的執行情況。這是非常有用的參數。,She
29、ll函數,shell腳本可以定義函數,將一些命令放在一個函數內,調 用函數名即可執行函數內的語句了。類似于C語言函數。 函數若沒有被調用,則不會執行 函數也有內置變量。在函數內部,$1,$2.和$ $#對應函數傳入的形參。可以在函數內用return表明函數的執行結束。 語法 函數名() . return 數字 return的返回碼也可以通過echo $?獲得。 函數定義好以后,就可以在腳本需要的地方像命令一樣使用: 函數名 參數 .,#!/bin/bash function_one() echo function one is called function_two() echo function two is called if $1 -eq 1 ;then function_one elif $1 -eq 2 ;then function_two else echo function doesnt exist! fi,shell函數范例,寫一個腳本ar.sh,跟據用戶的要求,求兩個數的算術運算。 下面是這個腳本的開頭,請寫完這個腳本。,#!/bin/b
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 應急指揮室管理制度
- 形體訓練室管理制度
- 往來款日常管理制度
- 德州市接待管理制度
- 必勝客員工管理制度
- 快遞收發點管理制度
- 總公司全套管理制度
- 總監辦工程管理制度
- 成品倉規章管理制度
- 房屋整修后管理制度
- 2025至2030中國成人用品行業產業運行態勢及投資規劃深度研究報告
- 2025年重慶市九年級中考語文試題卷及答案解析
- 公安院校公安學科專業招生政治考察表
- 2024年內蒙古錫林郭勒職業學院招聘真題
- 民航招飛駕駛測試題及答案
- 北京稅務籌劃課件
- 生物-七年級下冊期末復習知識點匯Z(冀少版2024)速記版 2024-2025學年七年級生物下學期
- 內燃機技術協議書
- 數字智慧方案數字鄉村信息化建設及精細化治理平臺建設方案
- 2024年隴南市事業單位專業技術人才引進筆試真題
- 2025屆浙江省精誠聯盟高三下學期適應性聯考生物試題
評論
0/150
提交評論