GE腳本源碼
-gt是大於的意思。
-eq是等於的意思。
-ne是不等於的意思。
-ge是大於等於的意思。
-lt是小於的意思。
-le是小於等於的意思。
B. 關於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++的編程經驗,並具有圖形學基礎
C. neo4j怎麼編寫自動化腳本
1、shell腳本自動化部署neo4j
#!/bin/bash
host_name=(
wyl01
wyl02
wyl03
)
host_ip=(
10.10.252.151
10.10.252.112
10.10.252.127
)
#neo4j部分信息
NEO4J_VERSION='neo4j-community-3.1.4' #neo4j的版本,注意這里不.tar.gz
NEO4J_INSTALL_PATH='/opt' #noe4j的安裝路徑
#1 步驟輸出 紫色
#2 正確輸出 綠色
#3 錯誤輸出 紅色
#4 提示輸出 藍色
#5 警告輸出 黃色
#根據不同的顏色列印出提示信息
function echo_fun(){
if [ $# -ge 2 ];then
params_num=$1
shift 1
params_mes=$@
else
echo_fun 3 請至少輸入兩個參數 echo_fun ..
exit
fi
case $params_num in
1)
echo -e "\n\033[35;40;1m ****************************** ${params_mes} ******************************\033[0m\r\n"
;;
2)
echo -e "\033[32;40;1m ${params_mes}\033[0m\r\n"
;;
3)
echo -e "\n\033[31;40;1m ${params_mes}\033[0m\r\n"
;;
4)
echo -e "\033[36;40;1m ${params_mes}\033[0m\r\n"
;;
5)
echo -e "\033[33;40;1m ${params_mes} \033[0m\r\n"
;;
*)
echo_fun 3 參數異常第一個參數應為1,2,3,4,5
;;
esac
}
function check_ok(){
if [ $? -ne 0 ];then
echo_fun 3 執行失敗,請查看日誌
exit 1
fi
}
function adser(){
useradd -d /home/$1 $1
expect -c"
spawn passwd $1
expect {
\"*yes/no*\" {send \"yes\r\";exp_continue}
\"*New password:*\" {send \"$2\r\";exp_continue}
\"*Retype new password:*\" {send \"$2\r\";exp_continue}
}"
}
function check_exist_user(){
num_user=`cat /etc/passwd|grep -w $1|wc -l`
if [ ${num_user} -eq 1 ];then
echo_fun 2 該機器已經創建了$1用戶,無需再創建,繼續下一步
num_user=`echo 1`
else
echo_fun 4 創建$1用戶
num_user=`echo 0`
fi
}
function check_catalog_exist(){
test -d $1 && echo_fun 5 $1的安裝目錄已經存在,請檢查 && exit
}
#檢查環境變數---單台
function check_etc_profile(){
echo_fun 4 配置環境變數
#檢查環境變數中是否已經配置了
path_num=`cat /etc/profile |grep -w $1 |wc -l `
if [ ${path_num} -ge 1 ];then
echo_fun 5 該機器環境變數中已經配置,請檢查准確性
#回滾,刪除之前的軟連接和安裝包
rm -rf $1
rm -rf $2
exit
fi
}
#解壓neo4j的二進制包,並設置軟連接,和改變其屬組屬性。
function extract_neo4j(){
cd $SOFTWARE_PATH
echo_fun 4 解壓neo4j二進制包,並創建軟連接
tar -xf ${NEO4J_VERSION}-unix.tar.gz -C ${NEO4J_INSTALL_PATH}
check_ok
ln -s ${NEO4J_INSTALL_PATH}/${NEO4J_VERSION} ${NEO4J_INSTALL_PATH}/neo4j
cd ${NEO4J_INSTALL_PATH}
chown -R $1:$1 ${NEO4J_INSTALL_PATH}/neo4j*
sleep 1s
}
function alter_neo4j_config(){
echo_fun 4 修改neo4j配置文件內容
sleep 1s
cd /${NEO4J_INSTALL_PATH}/neo4j/conf/
sed -i '/#dbms.directories.data/s/^#//' neo4j.conf
sed -i '/#dbms.directories.plugins/s/^#//' neo4j.conf
sed -i '/#dbms.directories.certificates/s/^#//' neo4j.conf
sed -i '/#dbms.directories.logs/s/^#//' neo4j.conf
sed -i '/#dbms.directories.lib/s/^#//' neo4j.conf
sed -i '/#dbms.directories.run/s/^#//' neo4j.conf
sed -i '/#dbms.connectors.default_listen_address/s/^#//' neo4j.conf
sed -i '/#dbms.connector.bolt.tls_leve/s/^#//' neo4j.conf
sed -i 's/#dbms.connector.bolt.listen_address=:7687/dbms.connector.bolt.listen_address='"${host_ip[0]}"':7687/g' neo4j.conf
sed -i 's/#dbms.connector.http.listen_address=:7474/dbms.connector.http.listen_address='"${host_ip[0]}"':7474/g' neo4j.conf
sed -i 's/#dbms.connector.https.listen_address=:7473/dbms.connector.https.listen_address='"${host_ip[0]}"':7473/g' neo4j.conf
sed -i '/#dbms.security.allow_csv_import_from_file_urls=true/s/^#//' neo4j.conf
sed -i '/#dbms.shell.enabled/s/^#//' neo4j.conf
sed -i 's/#dbms.shell.host=127.0.0.1/dbms.shell.host='"${host_ip[0]}"'/g' neo4j.conf
sed -i '/#dbms.shell.port=1337/s/^#//' neo4j.conf
}
function start_neo4j(){
echo_fun 4 啟動neo4j進程
su - ${NEO4J_USER} <<EOF
cd /opt/neo4j
nohup ./bin/neo4j start >/home/${NEO4J_USER}/neo4j.log 2>&1
EOF
}
function step_fun_4(){
echo_fun 4 檢查neo4j安裝目錄是否存在
check_catalog_exist ${NEO4J_INSTALL_PATH}/${NEO4J_VERSION}
echo_fun 5 請輸入neo4j的屬組用戶
read -p "neo4j_user=" neo4j_user
check_exist_user ${neo4j_user}
if [ $num_user -eq 0 ]; then
echo_fun 4 給neo4j用戶輸入密碼
read -p "neo4j_password=" neo4j_passwd
adser ${neo4j_user} ${neo4j_passwd}
fi
#解壓,設置軟連接
extract_neo4j ${neo4j_user}
#修改配置文件
alter_neo4j_config
#檢查環境變數
echo_fun 4 檢查環境變數
check_etc_profile ${NEO4J_INSTALL_PATH}/neo4j ${NEO4J_INSTALL_PATH}/${NEO4J_VERSION}
#配置環境變數
if [ ${path_num} -lt 1 ];then
echo -e '\nexport NEO4J_HOME='${NEO4J_INSTALL_PATH}'/neo4j\nexport PATH=${NEO4J_HOME}/bin:$PATH'>> /etc/profile
source /etc/profile
fi
#啟動neo4j
start_neo4j
neo4j_pid_num=`ps -ef |grep neo4j|grep -v grep|wc -l`
if [ ${neo4j_pid_num} -eq 1 ];then
echo_fun 2 neo4j has started....
echo_fun 2 在瀏覽器輸入${host_ip[0]}:7474
else
echo_fun 3 啟動失敗,請查看錯誤日誌信息/home/${NEO4J_USER}/neo4j.log
fi
}
step_fun_4
執行結果如下:
D. shell腳本中[ $j -ge 2 -a $j -le $(($wide-1)) ]是什麼意思
$j -ge 2 變數j大於等於2
$(($wide-1)) 計算 wide-1的值
$j -le $(($wide-1)) 變數j小於等wide-1
中間的 -a 表示and
整個式子用來判斷 j大於等於2並且j小於等於wide-1
E. python的strip_ge = re.compile(r"^ge(.{4,})")怎麼理解
在r"^ge(.{4,})")中
r表示原生字元串,即 不用對正則表達式中的反斜杠再轉義。
^ge表示以ge開頭的字元串。
.{4,}表示除回車換行符外的4個及以上的任意字元。
r"^ge(.{4,})")表示捕獲以ge開頭的字元串中ge後面的部分。
完整的Python程序如下。
import re
strip_ge = re.compile(r"^ge(.{4,})")
m=strip_ge.search('gehelloworld')
if m==None:
print(m)
else:
print(m.group(1))
源代碼(注意源代碼的縮進)