版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Chapter2 shell語法什么是shellshell作為用戶與Linux系統(tǒng)間接口的程序,它允許用戶向操作系統(tǒng)輸入需要執(zhí)行的命令。shell就是腳本程序. 用戶和操作系統(tǒng)之間的接口作為核外程序而存在shell的雙重角色:命令解釋程序Linux的開機(jī)啟動(dòng)過程;進(jìn)程樹Shell的工作步驟打印提示符;得到命令行;解析命令;查找文件;準(zhǔn)備參數(shù);執(zhí)行命令獨(dú)立的程序設(shè)計(jì)語言解釋器KISS (Keep It Small and Stupid)Reusable toolsRedirection and pipe執(zhí)行腳本文件的方法:方法1:$ sh script_file 方法2:chmod +x scr
2、ipt_file (chown, chgrp optionally)./script_file方法3:source script_file, or. script_file變量:在shell中,使用變量之前通常并不需要為它們做出聲明,只是通過使用它們(如在賦初始值時(shí))來創(chuàng)建它們。所有變量都被看做字符串并以字符串來存儲(chǔ),即使被賦值為數(shù)值時(shí)也是如此。Linux區(qū)分大小寫。在變量名前加一個(gè)符號(hào)$符號(hào)來訪問它的內(nèi)容 如 testvar =”9+8” echo $testvar 9+8如果字符串里包含空格,就必須用引號(hào)把它們括起來,另外在等號(hào)兩邊不能有空格(命令行中空格總是很重要的分隔符)使用read命
3、令將用戶輸入賦值給一個(gè)變量 read sa hhhh echo $sa引號(hào):var=”Hi here”echo $var -Hi hereecho”$var” -Hi hereecho $var -$varecho $var -$var雙引號(hào)作用:$ , ,這些字符的特殊含義還是存在單引號(hào):忽略所有的特殊字符用戶環(huán)境:.bash_profile, .bash_logout, .bashrc files.bash_profile: 用戶登錄時(shí)被讀取,其中包含的命令被bash執(zhí)行.bashrc: 啟動(dòng)一個(gè)新的shell時(shí)讀取并執(zhí)行.bash_logout: 登錄退出時(shí)讀取執(zhí)行Alias(別名)al
4、ias/unalias commandalias(中文稱為“別名”)允許使用更加簡(jiǎn)短的名稱來重新定義 Linux 中的 Shell 命令,從而簡(jiǎn)化命令行的輸入。基本用法: alias 的基本使用方法為:alias 新的命令=原命令 -選項(xiàng)/參數(shù)。舉例說明,alias l=ls -lsh 將重新定義 ls 命令,現(xiàn)在只需輸入 l 就可以列目錄了。獲知?jiǎng)e名: 直接輸入 alias 命令會(huì)列出當(dāng)前系統(tǒng)中所有已經(jīng)定義的命令別名。刪除別名: 要?jiǎng)h除一個(gè)別名,可以使用 unalias 命令,如 unalias l。環(huán)境變量export commandexport, env & set command環(huán)境變
5、量:當(dāng)一個(gè)shell腳本程序開始執(zhí)行時(shí),一些變量會(huì)根據(jù)環(huán)境設(shè)置中的值進(jìn)行初始化。這些變量通常用大寫字母做名字,以便把它們和用戶在腳本程序里定義得變量區(qū)分。如:$HOME:當(dāng)前用戶的家目錄$PATH: 以冒號(hào)分隔的用來搜索命令的目錄列表$PS1: 命令提示符,通常為$字符$PS2: 二級(jí)提示符,用來提示后續(xù)的輸入,通常為字符$IFS: 輸入域分隔符。當(dāng)shell讀取輸入時(shí),它給出用來分隔單詞的一組字符,通常為空格、制表符和換行符$0 : shell腳本的名字$# : 傳遞給腳本的參數(shù)個(gè)數(shù)$ : shell腳本的進(jìn)程號(hào),腳本程序通常會(huì)用它來生成一個(gè)唯一的臨時(shí)文件,如/tmp/tmpfile_$參數(shù)
6、變量:$1,$2, 腳本程序的參數(shù) (用戶在命令行中執(zhí)行shell腳本程序時(shí)傳入的參數(shù))$* 在一個(gè)變量中列出所有參數(shù),各個(gè)參數(shù)之間用環(huán)境變量IFS中的第一個(gè)字符分開$ 不使用IFS環(huán)境變量,即使IFS為空,參數(shù)也不會(huì)記在一起 條件:test 或 if test -f fred.c /test后面的空格不能少then fi或者if -f fred.c /兩側(cè)的空格不能少thenfitest 測(cè)試類型:P28(字符串比較、算數(shù)比較、邏輯、文件相關(guān))控制結(jié)構(gòu): if conditionthen statementselif condition; then statementselse statem
7、entsfi1、if 與 之間必須有空格2、 與判斷條件之間也必須有空格3、與; 之間不能有空格4、變量最好放在”里,可避免用戶傳入 空格引起錯(cuò)誤5、判斷條件中=兩邊應(yīng)該要有空格,否 則引起錯(cuò)誤for file in $(ls f*.sh); dolpr $filedoneexit 0for 語句 for variable in valuesdo statementsdonefor var in bar fur 43 /這兒bar fur 43 不能寫成”bar fur 43”,這樣當(dāng)成了一個(gè)字符串變量do echo $vardoneexit 0for語句適合于對(duì)一系列字符串循環(huán)處理while
8、 語句while condition; do /這里;不能漏 ;和do之間是否有空格無所謂statementsdoneuntil 語句until conditiondo statementsdone until與while條件相反,如果需要執(zhí)行循環(huán)至少一次,就使用while語句,如果可能根本就不需要執(zhí)行循環(huán),使用untilselect語句形式select item in itemlistdo statementsdone作用生成菜單列表case 語句case variable in pattern | pattern ) statements; pattern | pattern ) stat
9、ements; esac注意點(diǎn):每個(gè)case 都以;結(jié)尾case語句執(zhí)行時(shí),會(huì)把變量?jī)?nèi)容與各個(gè)語句依次比較,一旦成功,就會(huì)執(zhí)行)后的代碼合并匹配模式: case “$var” in yes|y|Yes|YES) echo”Good morning” echo”haha”; nN*) echo “Good Afternoon”; esac exit 0把最精確的匹配放在最前面,把最一般化的匹配放在最后命令列表AND:& 只有前面所有的命令都執(zhí)行成功的情況下才執(zhí)行后一條命令OR: |如果一條命令返回的是false,它右邊的命令才得以執(zhí)行語句塊 函數(shù) function_name () stateme
10、nts腳本程序從頂部開始執(zhí)行,在調(diào)用一個(gè)函數(shù)前必須先對(duì)它進(jìn)行定義局部變量當(dāng)與全局變量重名時(shí),可以在局部變量前加上local來區(qū)分對(duì)變量進(jìn)行初始化賦值時(shí)等號(hào)左右不能有空格在這兒如果將if yes_or_no $1 改成1會(huì)報(bào)錯(cuò),這可以看出子程序yes_or_no雖然是return 0 return 1 ,但并非真正返回0 或1,并且在Linux中return 0 表示成功,return 1反而表示錯(cuò)誤,shell中1并不代表true,如果改為true到是可以,就是if true,但失去了判斷的意義如果往if yes_or_no傳遞$*也是可以的,則在子程序中輸出也是:Is your name V
11、eronica Nick?命令shell中命令分為兩種類型:外部命令:可以在命令提示符中執(zhí)行的”普通”命令內(nèi)部命令:”內(nèi)置”命令,內(nèi)置命令是在shell內(nèi)部實(shí)現(xiàn)的,它們不能被作為外部程序被調(diào)用,內(nèi)部命令的執(zhí)行效率更高。break:默認(rèn)情況下,break只跳出一層循環(huán):命令:空命令 while: 相當(dāng)于 while truecontinue命令:使for,while,until循環(huán)跳到下一次循環(huán)繼續(xù)執(zhí)行,循環(huán)變量取循環(huán)列表的下一個(gè)值.命令:用于在當(dāng)前shell中執(zhí)行命令(通常用來設(shè)置腳本程序執(zhí)行的環(huán)境 例P44) 當(dāng)一個(gè)腳本執(zhí)行一條外部命令或腳本程序時(shí),它會(huì)創(chuàng)建一個(gè)新的環(huán)境(一個(gè)子shell),
12、命令將在這個(gè)新環(huán)境中執(zhí)行,在命令執(zhí)行完畢后,這個(gè)環(huán)境被丟棄,留下退出碼返回給父shell。但外部的source命令和點(diǎn)命令(這兩個(gè)命令差不多是同義詞)在執(zhí)行腳本程序中列出的命令時(shí),使用的是調(diào)用該腳本程序的同一個(gè)shell。 因?yàn)樵谀J(rèn)情況下,shell腳本程序會(huì)在一個(gè)新的環(huán)境中執(zhí)行,所以腳本程序?qū)Νh(huán)境變量所做的任何修改都會(huì)丟失,而點(diǎn)命令允許執(zhí)行的腳本程序改變當(dāng)前環(huán)境。當(dāng)你要把一個(gè)腳本當(dāng)作“包裹器”來為后續(xù)執(zhí)行的一些其他命令設(shè)置環(huán)境時(shí),這個(gè)命令通常很有用。 .命令作用有點(diǎn)類似于C或C+中的#include指令。盡管它并沒有從字面意義上包含腳本,但它的確是在當(dāng)前上下文中執(zhí)行命令,所以可以使用它將變
13、量和函數(shù)定義結(jié)合進(jìn)腳本程序。echo 命令: echo -n “string ” /* -n 表示去掉換行符*/ echo -e “string to outputc” -e確保啟用了反斜杠轉(zhuǎn)義字符(如c代表去掉換行符,t代表制表符,n代表回車)的解釋eval命令:eval命令允許對(duì)參數(shù)進(jìn)行求值,它是shell的內(nèi)置命令,通常不會(huì)以單獨(dú)命令的形式存在。 解釋: 1) 表示將$當(dāng)做$輸出,相當(dāng)于轉(zhuǎn)義,$即為$ $x的值為foo y=$foo(此處為賦值), echo $y(引用變量y) 則輸出$fooeval是將其后的字符串當(dāng)成命令來執(zhí)行,eval “l(fā)s -l”就是執(zhí)行命令ls -l語法:ev
14、al cmdline eval會(huì)將后面的cmdline進(jìn)行兩邊掃描,如果第一遍掃描后cmdline是一個(gè)普通命令,則執(zhí)行此命令,如果cmdline中含有變量的間接引用,則保證間接引用的含義exit n命令: exit 0 退出碼0表示成功exec命令:將當(dāng)前shell腳本程序替換為一個(gè)不同的程序如:在當(dāng)前shell腳本程序a.sh中有這么一句話:exec wall “Thanks for all the fish”,則a.sh執(zhí)行到該句話時(shí)會(huì)跳出當(dāng)前shell腳本程序,用wall 命令替換當(dāng)前shell,在a.sh exec之后的代碼都不會(huì)執(zhí)行,因?yàn)閳?zhí)行這個(gè)腳本的shell已經(jīng)不存在了。exp
15、ort命令:export命令將作為它參數(shù)的變量導(dǎo)出到子shell中,并使之在子shell中有效。在默認(rèn)情況下,在一個(gè)shell中被創(chuàng)建的變量在這個(gè)shell調(diào)用的下級(jí)(子)shell中是不可用的。export命令把自己的參數(shù)設(shè)為一個(gè)環(huán)境變量,而這個(gè)環(huán)境變量可以被當(dāng)前程序調(diào)用的其他腳本和程序看見。被導(dǎo)出的變量構(gòu)成從該shell衍生的任何子進(jìn)程的環(huán)境變量。只導(dǎo)出bar變量,所以能夠在export2中使用bar變量的值,空行的出現(xiàn)是因?yàn)?foo在export2中沒有定義,回顯一個(gè)null變量將輸出一個(gè)空行。expr命令:expr命令將它的參數(shù)當(dāng)作一個(gè)表達(dá)式來求值eval是對(duì)參數(shù)進(jìn)行求值,兩者不要混淆
16、z= 反引號(hào)字符取z的值為expr $x + $y的執(zhí)行結(jié)果,也可以用語法$()替換反引號(hào)如果去掉反引號(hào)或者$()會(huì)報(bào)錯(cuò);+兩邊要有空格,否則expr表達(dá)式通常會(huì)被替換為更為有效的$()語法printf命令: 不支持浮點(diǎn)數(shù),因?yàn)閟hell中所有的算數(shù)運(yùn)算都是按照整數(shù)來進(jìn)行計(jì)算的return命令:return命令有一個(gè)數(shù)值參數(shù),這個(gè)參數(shù)在調(diào)用該函數(shù)的腳本程序里被看做是該函數(shù)的返回值。如果沒有指定參數(shù),return命令默認(rèn)返回最后一條命令的退出碼。、set命令:set命令作用是為shell設(shè)置參數(shù)變量。許多命令的輸出結(jié)果是以空格分隔的值。#!/bin/shecho the date is $(da
17、te) set $(date) #把date命令的輸出值設(shè)置為參數(shù)列表echo The month is $2 #獲取參數(shù)列表中的第二個(gè)參數(shù)exit 0shift命令:shift命令把所有的參數(shù)變量作揖一個(gè)位置,使得$2變成$1,$3變成$2,一次類推,原來$1的值將被丟棄,$0仍將保持不變,$*,$#,$等其他的變量也將根據(jù)參數(shù)變量的新安排做出變動(dòng)。trap命令:1)trap命令用于指定在接收到信號(hào)后要采取的行動(dòng)。trap有兩個(gè)參數(shù),第一個(gè)參數(shù)是接收到指定信號(hào)時(shí)將要采取的行動(dòng),第二個(gè)參數(shù)是要處理的信號(hào)名。 trap command signal2)信號(hào)是指那些被異步發(fā)送到一個(gè)程序的事件。在默
18、認(rèn)情況下,通常會(huì)終止一個(gè)程序的運(yùn)行。信號(hào)名定義在頭文件signal.h中,在使用信號(hào)名時(shí)要省略SIG前綴。3)trap -l來查看信號(hào)編號(hào)及其關(guān)聯(lián)的名稱。如果要重置某個(gè)信號(hào)的處理方式到其默認(rèn)值,只需將command設(shè)置為-。如果要忽略某個(gè)信號(hào),就把command設(shè)置為空字符串 。一個(gè)不帶參數(shù)的trap命令將列出當(dāng)前設(shè)置的信號(hào)及其行動(dòng)的清單。信號(hào)列表P50解釋:先用trap命令安排它在出現(xiàn)一個(gè)INT(中斷)信號(hào)時(shí)執(zhí)行rm f /tmp/my_tmp_file_$命令刪除臨時(shí)文件。腳本程序然后進(jìn)入一個(gè)while循環(huán),只要臨時(shí)文件存在,循環(huán)會(huì)一直持續(xù)下去,當(dāng)用戶按下Ctrl+C組合鍵時(shí),腳本程序會(huì)執(zhí)
19、行rm f /tmp/my_tmp_file_$語句,然后繼續(xù)下一個(gè)循環(huán),因?yàn)榕R時(shí)文件已經(jīng)被刪除了,第一個(gè)while循環(huán)將正常退出。 接下來,腳本程序再次調(diào)用trap命令,這次是聲明當(dāng)一個(gè)INT信號(hào)出現(xiàn)時(shí)執(zhí)行默認(rèn)命令(-通常為退出),腳本程序然后重新創(chuàng)建臨時(shí)文件并進(jìn)入第二個(gè)while循環(huán),這次當(dāng)用戶按下Ctrl+C組合鍵時(shí),默認(rèn)語句被執(zhí)行,終止腳本程序,所以echo和exit永遠(yuǎn)執(zhí)行不到。另外,如果把 改成,則第二個(gè)循環(huán)會(huì)成為死循環(huán),因?yàn)閟hell忽略INT信號(hào)。unset命令:從環(huán)境中刪除變量或函數(shù),這個(gè)命令不能刪除shell本身定義的只讀變量(如IFS)P57、58Find命令Grep命令fi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年莊河市大學(xué)生政務(wù)實(shí)習(xí)“揚(yáng)帆計(jì)劃”暨寒假“返家鄉(xiāng)”社會(huì)實(shí)踐活動(dòng)開始!考試核心題庫及答案解析
- 江西省水務(wù)集團(tuán)有限公司2025年第三批社會(huì)招聘【34人】參考考試試題及答案解析
- 2025年同城快遞騎手服務(wù)合同協(xié)議
- 2026貴州黎平肇興文化旅游開發(fā)(集團(tuán))有限公司招聘18人備考筆試題庫及答案解析
- 2025廣東清遠(yuǎn)市第三中學(xué)招聘教師3人備考筆試試題及答案解析
- 2025西安市長(zhǎng)安區(qū)高橋鄉(xiāng)衛(wèi)生院招聘筆試重點(diǎn)題庫及答案解析
- 2025年體檢中心服務(wù)委托合同協(xié)議
- 2026上半年云南普洱市勐馬鎮(zhèn)征兵考試重點(diǎn)試題及答案解析
- 2026河北滄州醫(yī)學(xué)高等??茖W(xué)校高層次人才選聘50人備考考試試題及答案解析
- 2025吉林松原市長(zhǎng)嶺經(jīng)濟(jì)開發(fā)區(qū)招聘專業(yè)監(jiān)管人員1人備考核心題庫及答案解析
- 中孕期產(chǎn)前超聲檢查
- 超星爾雅學(xué)習(xí)通《從愛因斯坦到霍金的宇宙(北京師范大學(xué))》2024章節(jié)測(cè)試含答案
- 《隱身技術(shù)概述》課件
- 財(cái)務(wù)培訓(xùn)之商場(chǎng)財(cái)務(wù)制度與流程
- 上海華東師大二附中2024屆招生全國統(tǒng)一考試(模擬卷)物理試題
- 小學(xué)綜合實(shí)踐活動(dòng)-巧除污漬教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 《干部履歷表》1999版電子版
- 藥學(xué)服務(wù)-醫(yī)院藥學(xué)信息服務(wù)
- 醫(yī)療器械驗(yàn)收記錄
- 語言表達(dá)的藝術(shù)與技巧知到章節(jié)答案智慧樹2023年華僑大學(xué)
- 氣象雷達(dá)的使用及雷雨繞飛講課講稿
評(píng)論
0/150
提交評(píng)論