① shell腳本
Shell腳本基本知識
概述:shell其實是內核與用戶之間的一個介面,
shell腳本
如果有一系列經常使用的linux命令,你可以把它們存儲在一個文件腫。shenll可以讀取這個文件,並執行其中的命令。這樣的文件成為腳本文件。
執行shell腳本
要創建一個shell腳本,你要使用任何編輯器比如vi在文本文件中編寫他。
為了使用bashshell賴執行腳本magic,其命令是:bashmagic或者./magic
echo命令:
echo「!」
屏幕上就會回顯「!」
#符號
用於在shell腳本腫可以包含註解入口
echo「hello」
#thisisacommentline.thiswouldnotproceanyoutput!
echo「world!」
第二行是一個註解的例子。它將被shell忽略,而且不產生任何消息
變數:
可以在任何時間通過簡單的賦值來創建。
語法:
<variablename>-<value>
Linux中的所有變數都被當作字元串
引用變數:
$符號用於引用一個變數的內容
variable1=${variable2}
讀入值給變數
在執行shell腳本時,shell還允許用戶直接從鍵盤讀入一個值給變數,還可以使用read命令來作。
$readfname
本地和全局shell變數
局部變數
當引用shell時,只有創建它的shell能夠知道變數的存在
全局變數
稱為子shell
shell中創建的變數局部於創建它的shell,除非使用export命令特別指出是全局的。
環境變數:
通過改變這些變數的值,用戶能夠定製此環境
一些環境變數的例子是HOME,PATH,PS1,PS2,LOGNAME,SHLVL,及SHELL
HOME變數
Linux系統中的每個用戶都有一個相關的稱作HOME的目錄
當一個用戶登錄後,進入相應的HOME的目錄
$echo$HOME
PATH變數
包含一列用冒號定界的目錄的路徑名字,便於可執行程序的搜索。
PS1變數
PS1(PromptString1)變數包含了shell提示符,$符號
$PS1=「HELLO>」
HELLO>
PS2變數
是為第二個提示符設置值的環境變數
LOGNAME變數
包含用戶的注冊名字
$echo「${LOGNAME}」
SHLVL變數
該變數包含當前工作的shelllevel
SHELL變數
環境變數存儲了用戶預設的shell
env命令
可用來查看所有的已移出的環境變數表和它們各自的值!
命令替換
在單個命令行中使用多個命令的另外一種方法(非Pipes)是通過命令替換
echo「thedatais`date`」
expr命令
用於求之算術表達式。該命令的輸出被送到標准輸出
$expr4+5
將在屏幕上顯示9
算術展開:
你可以在$((…))中括一個表達式,用下面的命令來計算它的值;
$((expression))
example1
編寫一個shell腳本用於計算呼叫中心未應答的詢問的數量。該腳本應該接受一天那所報告的詢問的總數和應答的詢問的數量,以便計算未應答的詢問的數量。
所有未應答的詢問總數=所有詢問的總數-應答的詢問的數量
<!--[if!supportLists]-->※<!--[endif]-->※※※※※※※※※※※※※※※※※※※※※※※
條件執行
test和[]
求值表達式,並返回true(0)或false()
數值測試:
-eq等於則為真
-ne不等於則為真
-gt大於則為真
-ge大於等於則為真
-lt小於則為真
-le小於等於則為真
if構造
Linuxshell提供了循環和判定的構造,可以在shell腳本中使用
算術測試
結合if構造,它可以用於測試變數的數字值
串測試
test命令也可以用於字元串
=等於則為真
!=不相等則為真
-z字元串長度為零則為真
-n字元串長度不為零則為真
文件測試
test命令也可以用於檢查文件的狀態
-e文件存在則為真
-r文件存在並且可讀則為真
-w文件存在並且可寫則為真
-x文件存在並且可執行則為真
-s文件存在並且至少有一個字元則為真
-d文件存在並且為目錄則為真
-f文件存在並且為普通文件則為真
-c文件存在並且為字元型文件則為真
-b文件存在並且為塊特殊文件則為真
-a並且-o或者!非
exit命令
用於終止shell腳本的執行並返回到$提示符下
case。。。esac
shell腳本中使用的這個構造依據變數的值而執行一組特定指令
當變數的值和其中的一個值匹配的時候,就執行寫在該值下的一組命令。
example3
迭代
while構造
while<條件>
do
<命令(s)>
done
只有條件為真的時候,才能執行do與done之間的命令
until構造
until循環構造的求值模式於while循環相反
until循環將繼續執行直到求值的條件為真的時候
for構造
forvariable_namein<list_of_values>
do
…
done
for循環取一列值作為輸入並對循環中每個值執行循環
break和contineu命令
同其他語言中的用法
example4
控制進程的執行
請求後台處理
用於請求後台進程的符號是(&)
$wctempfile&
[1]2082
$vinewfile
檢查後台進程
ps(進程狀態)命令為每個當前的活動的每個進程產生一行入口。
終止後台進程
可用kill,如下所示
kill278
查看完成一個命令所花的時間
你可以使用time命令來查看一個命令從開始到結束所花的時間
timefine/etc–name「passwd」2>/dev/null/dev/null表明忽略錯誤信息。
管道的介紹
垂直條(|)是管道字元
它只是shell:「|」前面命令的輸出作為「|」之後命令的輸入發送
ls–l|more
用管道組合命令,功能強大
② linux下寫腳本時-gt是什麼意思
-gt是大於的意思。
-eq是等於的意思。
-ne是不等於的意思。
-ge是大於等於的意思。
-lt是小於的意思。
-le是小於等於的意思。
③ shell腳本 -d 是目錄文件,那麼-e,-f分別是什麼還有"! -e"這又是什麼意思呢
-e表示如果filename存在,則為真。
-f表示如果filename為常規文件,則為真。
!-e表示取非,如果filename存在,則為假。
(3)腳本中ge擴展閱讀:
shell和shell腳本的區別:
確切一點說,Shell就是一個命令行解釋器,它的作用就是遵循一定的語法將輸入的命令加以解釋並傳給系統。它為用戶提供了一個向Linux發送請求以便運行程序的介面系統級程序,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程序。
Shell本身是一個用c語言編寫的程序,它是用戶使用Linux的橋梁。Shell既是一種命令語言,又是一種程序設計語言(就是你所說的shell腳本)。
作為命令語言,它互動式地解釋和執行用戶輸入的命令;作為程序設計語言,它定義了各種變數和參數,並提供了許多在高階語言中才具有的控制結構,包括循環和分支。
它雖然不是 Linux系統內核的一部分,但它調用了系統內核的大部分功能來執行程序、創建文檔並以並行的方式協調各個程序的運行。
④ shell求助,數值比較-eq,-ne,-gt,-ge,-lt,-le。書上說的是:假值是零,真值為1,可寫的腳本卻出錯了。
要不是你看錯了,要不就是書上寫錯了!
正解:$?是shell變數,表示"最後一次執行命令"的退出狀態.0為成功,非0為失敗.
切記:$?永遠表示shell命令最後一次執行後的退出狀態,當函數執行完畢後,如果又執行了其它命令,則$?不再表示函數執行後的狀態,而表示其它命令的退出狀態.
⑤ 關於mel腳本語言的編寫與使用
ge(Maya內置語言)的縮寫,是一種強大的命令和腳本語言,讓你直接控制Maya的特徵、進程和工作流程。mel能做什麼,不能做什麼?能做的mel有一個很重要的功能是編寫界面,Maya的整個界面是用mel編寫的,Maya中的所有界面元素都可以編寫到你自己的mel程序界面中,你可以用mel跟據自己的習慣定製自己的操作界面。Maya中的所有的按鈕命令都是通過mel來調用的,你可以記錄並把其中一些命令組合起來,通過一鍵或按鈕來自動執行這一組命令,就像PhotoShop里的Actions一樣。Maya中的每一步操作都是在執行mel,因此Maya的任何一個功能,能做的任何一項操作,都可以加到你自己的mel程序中。mel有著和c語言類似的語法,有強大的字元串處理功能,還包含一些較為低層的命令(比如說獲取選擇物體的名稱和獲取點在空間中的坐標值等命令),可以編寫一些Maya中沒有的,較為復雜的功能。不能做的mel是一種腳本語言,受腳本解釋器(Command Engine)和Maya內置命令的影響,還是有很多局限的。mel不能使用ActiveX插件。mel只能根據Maya中已有的命令(dll或mll中注冊過的命令)進行擴展,無法直接調用dll模塊中的函數。我們平常使用的dll或exe程序文件是經過編譯器優化的二進制文件,命令的執行速度非常快。mel腳本語言是文本,有一個腳本解釋器分析的過程,命令的執行速度較慢,大約要慢20倍。mel不支持指針,不能對內存進行直接操作。這就導致了很多方面的效率超級低下,對內存的間接操作可能會使運行速度降低100倍甚至1000倍以上。不過這樣也有一個不容爭辯的好處,就是不會產生內存泄漏,保障了Maya的穩定性。mel不能讀寫二進制文件。既然mel不支持指針,不支持數據結構,就算能夠讀寫二進制文件意義也不大。mel不能編寫程序渲染器、播放器;不能編寫Maya中不存在的界面元素,如TreeView、RichEdit、透明窗口等;不能編寫讀取二進制文件的程序,如3dmax(*.max)、LightWave(*.lwo,*.lw)等。有人問過mel能不能編寫病毒問題。答案是肯定的。編寫mel病毒不需要什麼高超的技能,只要通過mel調用dos命令或 JavaScript/VBScript命令就行了。編寫病毒是一件損人不利己的事,mel病毒決對不能代表編寫者的技術高深,只能說明他的素質低劣。 mel病毒極其罕見,只聽說國內有人編過,並害了自己人。如果萬一你被mel病毒格式了硬碟或刪除了文件,可以用EasyRecover之類的程序來恢復,但有一點一定要記住,就是在恢復文件之前千萬不要對受損的硬碟進行寫操作!包括不能把恢復的數據存到受損的硬碟上!否則再厲害的高手也救不了你。學Maya一定要學mel嗎?不一定非要學mel。但由於Maya與mel的關系太密切了,Maya的用戶界面就是用mel編寫的,你在Maya中的每一步操作都是在執行mel,你也經常會在表達式里用到mel,或使用別人編寫的外部mel程序,這一切都要求你至少要對mel有一個初步的了解。可以先學mel再學Maya嗎?不可以。只有先熟悉的Maya的操作後才可以學mel。一般至少學兩個月以上的Maya,才可以學mel。學mel是否要有編程基礎?是否應該先學C語言再學mel?有編程基礎的確會對學mel有很大幫助,但這並不是說學mel一定要有編程基礎。C語言和Java語言雖然在語法上與mel很相似,但在編程的思路方面有很大差距,mel更注重代碼的簡潔而非代碼運行的高效率。由於mel是不需要編譯的腳本語言,對一些編程的規范要求不是很嚴格,學習起來會比C或Java更簡單一些。學mel是否要學好數學?是否要學好圖形學?如果你是學理科的,而且以後打算在3D圖形編程這方面發展,那麼學好數學和圖形學是必須的。如果你是搞藝術的,學mel只是為了輔助Maya作圖,那麼你就少在數學和圖形學上浪費時間。mel是比較高層的腳本語言,一般都是直接調用Maya中已經編好的演算法,你只要熟練掌握Maya的操作就行了。如果你有比較好的圖形學基礎,可能反而會不喜歡使用mel,因為很多優秀的演算法無法用mel實現 - mel的速度太慢了。如何編寫mel?mel是腳本語言,這就意味著你可以用任何文本編輯器來編寫,比如寫字板、記事本等。Maya自帶的編輯器不好用,所以我們一般使用外部編輯器來編寫mel。比較專業的編輯器有:TextPad、 UltraEditor、EditPlus等,有了這些編輯器後還要在網上(比如Highend3d)下載一個mel語法加亮文件,配置好後,才好用。如何使用mel?mel編輯器單行的mel命令,可以直接在命令行(Command Line)執行,也可以在Window > General Editors > Command Shell執行。多行的mel代碼,可以在Script Editor中按Ctrl+Enter執行。shelf在Shelf中執行mel。把要執行的代碼選中,用滑鼠拖放到Shelf上,Shelf上多了一個mel圖標,點這個圖標,就可以執行你的mel代碼了。使用textToShelf命令。比如:textToShelf "cube" "polyCube";可以在當前Shelf上建一個polyCube命令的圖標。使用Shelf Editor,添加、編輯你的mel代碼,或更改圖標。mel文件mel文件的名字必須取與文件中的主函數相同的名字。要把mel文件復制到我的文檔/Maya/5.0/scripts目錄中,然後在命令行輸入主函數名就可以執行這個函數命令。源化腳本(Source Script)Source Script可以使mel文件中的代碼或命令立即生效。有幾種方法可以Source Script,比如說可以在命令行執行source yourScript.mel,或用Script Editor的File > Source Script...,或直接把你的mel文件拖放到Maya的視窗中。啟動文件userSetup.mel要想在Maya每次啟動時都執行某一段代碼,需要把這段代碼加到Maya的啟動文件userSetup.mel中。具體方法是在我的文檔/Maya/5.0/scripts目錄中新建一個文本文件並重命名為userSetup.mel,然後把你的代碼加到這個文件中。如果scripts目錄中已經存在了userSetup.mel,就把你的代碼加到這個文件的結尾。其它也可以通過快捷鍵、菜單、Marking Menu、mll插件、外部程序文件、JavaScript等方法來調用mel。如何學習mel?學mel最好的參考手冊就是Maya的幫助文檔,遇到問題時,應首先從這些文檔中找答案。我把文檔中的Mel Command Reference部分做成了chm文件便於查詢,可以點此處下載。要想提高自已的水平,需要多看別人編寫的mel代碼。<disk>:\\Alias\\Maya6.0\\scripts目錄中存放著所有 Maya自帶的mel,這些mel可以隨意抄寫,修改並發布,無版許可權制,是我們學習的範本。另外在Maya官方網站和Highend3d也可以下載到大量有用的mel供我們學習。什麼是表達式?mel與表達式有什麼關系?mel與表達式的關系,Maya幫助文檔中講得很清楚:Expressions have a different purpose from MEL commands and MEL scripts. You enter a MEL command to do a single action, for example, to create a sphere.A MEL script is a list of commands you create to do a sequence of actions, for instance, create a wall-shaped object and apply a brick texture to it.Because you store a MEL script in a file on disk, you can run a script in different scenes and different work sessions, whether today or next year.An expression animates one or more attributes over time in a single scene. By default, an expression executes each frame as an animation plays. After you create an expression, it executes whenever you play the animation-including when you play the animation after saving, closing, and reopening the scene.A MEL command or script is not part of a scene after you execute it. You must execute it again to repeat the action.做幾點補充說明:mel是用戶與Maya內部機制交流的通道。mel不能直接編寫節點和屬性,因此往往要使用表達式才能對物體進行實時控制。表達式是與動畫不可分割的,表達式與動畫的時間(time或frame)有密切的關系,表達式對動畫的每一幀都要進行計算。在表達式中可以使用mel,但很多mel用在表達式中是沒有意義的,比如說一般不會把編寫界面的mel用在表達式中。mel腳本可以用於任何場景。表達式只能用於一個場景,另一個場景即使用到相同的表達式,也要重新創建。表達式主要是對物體的屬性進行控制,可以用等號對物體的屬性直接取值或賦值,例如:cone.translateX = 3;而mel就必須用getAttr或setAttr來做同樣的事情了,例如:setAttr cone.translateX 3;什麼是MayaAPI?與mel有什麼關系?API - Application Programmer Interface(應用程序界面)。也有人稱作SDK,是一種專門給程序員使用的界面或介面。MayaAPI提供了Maya的5個dll文件。這些dll中包含控制Maya的大量類和函數,我們通過這些類和函數用vc++編寫自己的dll(mll)文件,這些函數通過Maya的方式(比如用mel命令的形式)來調用。我們常用到的*.mll插件都是通過MayaAPI編寫的。MayaAPI比mel更強大,更復雜,效率更高,能做到許多mel做不到的事情,運行速度在mel的十倍以上。MayaAPI的功能主要體現在以下幾點:編寫mel命令。 執行mel命令。 進行創建物體,選擇、縮放、刪除等基本操作。 編寫manipulator。 編寫contexts(tool)。 編寫屬性節點。 編寫材質節點。 文件輸入輸出。 編寫獨立的exe控制台程序。MayaAPI程序因為使用vc++,可以使用MayaAPI,MFC,還有很多SDK,幾乎是無所限制。不過不能改動Maya底層的東西,不能更改Maya的運作方式。使用MayaAPI,需要有vc++的編程經驗,並具有圖形學基礎