腳本尾號
1. 腳本命令里的一些特殊符號都有什麼作用
1 >>是向文件尾部追加內容的命令
echo "test" >> file1
中的>>是將"test"追加到文件file1尾部
2 &&是邏輯操作符,&&左側命令執行成功才會執行右側命令
ls && pwd
兩個命令都會執行
ls notExistFile && pwd
因ls命令執行不成功,所以pwd命令就不會執行
3 %1代表命令行第一個參數
./myShell file1
在myShell腳本中%1就是file1
2. 手機游戲腳本製作教程
你可以先去【繪學霸】網站找「游戲設計/游戲製作」板塊的【免費】視頻教程-【點擊進入】完整入門到精通視頻教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=307&zdhhr-11y04r-1954100637344759628
想要系統的學習可以考慮報一個網路直播課,推薦CGWANG的網路課。老師講得細,上完還可以回看,還有同類型錄播課可以免費學(贈送終身VIP)。
自製能力相對較弱的話,建議還是去好點的培訓機構,實力和規模在國內排名前幾的大機構,推薦行業龍頭:王氏教育。
王氏教育全國直營校區面授課程試聽【復制後面鏈接在瀏覽器也可打開】: www.huixueba.com.cn/school/3dmodel?type=2&zdhhr-11y04r-1954100637344759628
在「游戲設計/游戲製作」領域的培訓機構里,【王氏教育】是國內的老大,且沒有加盟分校,都是總部直營的連鎖校區。跟很多其它同類型大機構不一樣的是:王氏教育每個校區都是實體面授,老師是手把手教,而且有專門的班主任從早盯到晚,爆肝式的學習模式,提升會很快,特別適合基礎差的學生。
大家可以先把【繪學霸】APP下載到自己手機,方便碎片時間學習——繪學霸APP下載: www.huixueba.com.cn/Scripts/download.html
3. 傳奇腳本語法
1、函數
如:走到[ ] 以及邊走邊打[ ] 等。
函數的格式是:函數名後面接兩個中括弧"[]",中括弧裡面填寫該函數所需要的參數,有些函數需要填寫參數,有些函數不需要填寫參數,但是無論有沒有參數,中括弧都是必須的。
2、觸發器
如:觸發器(條件函數[ ],判斷周期)普通函數[ ] 。
格式:解發器用於實時判斷是否達到我們設定的條件,當達到設定的條件時,執行指定的動作,可以寫在腳本的任意位置,但是為了方便查看 一般寫到腳本頭部。
3、跳轉標簽
如:<腳本開始> 以及 <打怪流程> 等。
格式:標簽代碼並沒有什麼實際的動作,它的作用相當給腳本設置一個路標,告訴腳本下一步該往哪走,格式是在兩個<>中間填入一個你認為好記的名字。
4、注釋(備注)
如://這里填寫注釋內容。
格式:注釋符號是兩個反斜杠//,後面接注釋的內容,這種代碼沒有實際的動作,可以寫到任意位置,可以把某代碼的作用以注釋的形式寫在該代碼後面,方便自己查看該代碼的含義及作用。
5、LUA代碼段
如: /< print("這里是LUA代碼") />
格式:用於嵌入一段LUA代碼,代碼段頭部要加 /< , 代碼段尾部要加 /> 。「/<」與「/>」括起來的中間這段代碼就是標準的LUA代碼。
4. 腳本代碼指的是什麼程序語言編寫的
一、啥叫腳本呢?
其實就是一段代碼,作用就是:這些代碼通過你的瀏覽器來鼓搗一下你的機器。這樣,你就能通過點一下滑鼠就可以發點歡迎詞、發點情話啥地了。
二、怎麼在聊天室放腳本呢?
<script src=您的腳本存放地址></script>
把這段代碼放你右下角鏈接里就可以了。
三、你瀏覽器咋會知道你放腳本了呢?
因為每段腳本務都放在<script>和</script>之間了。一見到<script>字樣,瀏覽器就會當成腳本來分析了。純屬瀏覽器的條件反射之一。
四、我從寒江腳本里學到啥了?
1、定義一個變數:
var a=1 的意思就是:定義一個變數a,並給a賦值為1
2、為啥要定義變數呢?
這話說的,幹活不用人哪行啊?其實定義變數就是事先找幾個人來,留著以後派給任務。
3、定義一個數組變數
var a_name_filter = new Array(。。。);
其實數組變數也是相當於找人,只不過這個人可以干好幾樣活而已(屬於能人類型的)。
4、定義功能函數
function a(){}
這相當於各項任務。事先定義的變數一般會在這里體現出來。當你在腳本里寫上a()之後,瀏覽器就會條件反射了(執行a功能函數中的語句)。
五、腳本的說明文字
啥東西都得有個說明書不是,腳本也得有呀,而且這個說明書最好要寫在代碼里(要不過後自己都看不明白了,多丟人啊。)
那麼怎麼寫說明呢?
1、某行代碼的說明可以放在此行代碼的最後面,在行尾打上//然後再寫入文字說明就可以了。
例如:
var room_name="悠悠檸檬情"; //聊天室名字
2、如果文字太多,一行寫不下那咋辦啊?
在此特殊說明一下,其實盡管代碼一般都是英文字元,但說明文字絕對可以兼容現代漢語以及文言文的,(←廢話)
如果是多行說明文字,可以這樣寫
//---------------------------------------------
//孤鶴腳本0.9999版just for my Love
//
//失去,也是一種篤定。
//
//就算擁有的時光,是那麽短暫;
//
//能夠無怨無悔地為一個人付出,就是幸福。
//---------------------------------------------
看著感覺還不錯吧?(^!-)
當然,還有更方便的寫法,就是在說明文字的第一行寫上/*,再在最後一行寫上*/。例子如下:
/*
孤鶴腳本0.9999版 just for my Love
小薇啊,你可知道我多愛你,
我要帶你飛到天上去
看那星星多麼美麗
摘下一顆,輕輕送給你。。。
*/
本人強烈建議,不要在腳本里寫歌詞,因為有可能導致看腳本人的情感波動。:-)
六、數據類型
數據類型包括:字元串、數值、布爾三種類型。
javascript帶有數據類型強制轉換功能,這對編寫者(尤其是對喝完酒寫代碼的人)來講是一個大大的好事。要不你還得記好多的數據轉換函數。
七、JScript的運算符
關於運算符的講解,將會涉及很多很多的知識,請小學沒有畢業的同志自學完成小學課程之後再看。
計算 符號 位運算 符號
-------------------------------------
負值 - 邏輯非 !
遞增 ++ 小於 <
遞減 -- 大於 >
乘法 * 小於等於 <=
除法 / 大於等於 >=
加法 + 等於 ==
加法 + 不等於 !=
減法 - 邏輯與 &&
等於 =
例一:
x=1+2
=======
答案:x被賦值為3
例二:
if (mylove=="小薇") {
document.write("回答正確,您屬於多愁善感型的")
} else {
document.write("回答錯誤!您屬於沒事找抽型的")
} ======
運行結果:
如果變數mylove的值為「小薇」,那麼,程序會執行document.write("回答正確,您屬於多愁善感型的")
否則,則執行document.write("回答錯誤!您屬於沒事找抽型的")
我學到的腳本知識(二)
今夜,讓我靜靜地想你(詩配JS語句篇)
今夜,我悵坐一隅靜靜地想你,
想知道你在做什麼,想知道你有沒有在想我;
一、if...else 語句[根據表達式的值,有條件地執行一組語句。]
我想你,你想我嗎?如果我不想你,那麼你還想我嗎?
用語句控制如下:
if 我想你 {你想我嗎?} else{那麼你還想我嗎?}
通常都先定義一個變數來做為判斷條件。
a='我想你';
if (a=='我想你') { b='你想我嗎?'} else { b='那麼你還想我嗎?' }
二、do...while 語句[第一次執行一個語句塊,然後重復循環的執行該語句塊,直到條件表達式等於 false。]
折九百九十九隻紙鶴我就會去睡的,
用語句控制如下:
i=1;
do
(折一隻紙鶴;)
i=i++;
while(i<999)
三、switch 語句[當指定的表達式的值與某個標簽匹配時,即執行相應的一個或多個語句。]
我想你,
(假設前面已經為a賦值)
switch(a){
case 想為你點亮一盞桔色的燈,:
靜靜守候著你疲憊的歸來;
case 想為你遞上一杯溫熱的香茗,:
緩緩驅散你臉上的倦容;
case 想用我溫柔纖細的手指,:
輕輕撫平你眼角的皺紋;
case 想用我輕柔溫情的呢喃,:
撫慰你驛動不安的心靈。;
}
然後靜靜地看著你……
我祈求,祈求這一刻的寧靜、永恆。
四、for 語句[只要指定條件為 true 都執行語句塊。]
(第二條語句也可以用FOR語句來表達)
用語句控制如下:
for (i = 1; i < 999; i++) {
(折一隻紙鶴;)
}
五、while 語句[執行一個語句,直到指定的條件為 false。]
(第二條語句也可以用while語句來表達)
折九百九十九隻紙鶴我就會去睡的,
用語句控制如下:
var i=1;
while (i < 999) {
(折一隻紙鶴;)
i++;
}
我學到的腳本知識(三)
前二篇,已經把腳本的基本知識粗略地介紹了一下,基礎知識也介紹得差不多了,再有一些不太常用的只能在實戰中總結了。
以下結合寒江322腳本解釋一下。
粗看了一下寒江322腳本,大概共分四個部分
第一部分:變數定義部分,前516行。
第二部分:加入新的界面元素
第三部分:重新設置原有界面元素的樣式
第四部分:系統初始化
=====第一部分====
這部分內容於「我所學到的腳本知識(一)」中有介紹。
其實就是定義了一些變數(包括數組變數),這些定義好的變數會在下面的幾個部分中使用。
例一:
var room_name="心夢如語";// 房間名稱
定義了一個變數:room_name,並賦值為:心夢如語
注意寫法:
var 變數名 = 變數值 ;
定義一個變數,前面一定要有var,每句結束時要有";"符號。
後面的「// 房間名稱」部分為說明文字,在腳本執行時將被自動忽略。
例二:
// 按鈕背景圖片 寬度,文件名
var a_btn_pic = new Array
( 17, "btn17.gif",
18, "btn18.gif",
19, "btn19.gif",
35, "btn35.gif",
46, "btn46.gif",
70, "btn70.gif"
);
定義一個變數數組,每個值中間以「,」分隔。
其實也可以寫成如下形式:
var a_btn_pic = new Array(17,"btn17.gif",18,"btn18.gif",19,"btn19.gif",35,"tn35.gif",46,"btn46.gif",70,"btn70.gif");
這樣寫的話,腳本的體積會減小,但腳本的可讀性會差一些。
例三:
//——圖片——
var a_picture = new Array
( "你好", "pic/p001.gif",
"鼓掌", "pic/p002.gif",
。。
。 )
與
//——背景色——
var a_bkcolor = new Array
( "FFFFFF",
"fdd242",
"f8fead",
"a0e4a0",
。。
。 )
只是寫法的格式不同,其實都是定義變數數組。
好了,到現在為止,你已經完全理解了寒江322腳本的前516行的內容了(322腳本共1956行)。恭喜恭喜
我學到的腳本知識(四)
前三篇已經把腳本的基本知識粗略地介紹了一下,基礎知識也介紹得差不多了,再有一些不太常用的只能在實戰中總結了。
以下結合寒江322腳本解釋一下。
以下內容由發布之日起執行,如有與國家法律法規相抵觸,請按寒江322腳本之標准執行。
粗看了一下寒江322腳本,大概共分四個部分
第一部分:變數定義部分,前516行。
第二部分:加入新的界面元素
第三部分:重新設置原有界面元素的樣式
第四部分:系統初始化
=====第一部分====
這部分內容於「我所學到的腳本知識(一)」中有介紹。
其實就是定義了一些變數(包括數組變數),這些定義好的變數會在下面的幾個部分中使用。
例一:
var room_name="心夢如語";// 房間名稱
定義了一個變數:room_name,並賦值為:心夢如語
注意寫法:
var 變數名 = 變數值 ;
定義一個變數,前面一定要有var,每句結束時要有";"符號。
後面的「// 房間名稱」部分為說明文字,在腳本執行時將被自動忽略。
例二:
// 按鈕背景圖片 寬度,文件名
var a_btn_pic = new Array
( 17, "btn17.gif",
18, "btn18.gif",
19, "btn19.gif",
35, "btn35.gif",
46, "btn46.gif",
70, "btn70.gif"
);
定義一個變數數組,每個值中間以「,」分隔。
其實也可以寫成如下形式:
var a_btn_pic = new Array(17,"btn17.gif",18,"btn18.gif",19,"btn19.gif",35,"tn35.gif",46,"btn46.gif",70,"btn70.gif");
這樣寫的話,腳本的體積會減小,但腳本的可讀性會差一些。
例三:
//——圖片——
var a_picture = new Array
( "你好", "pic/p001.gif",
"鼓掌", "pic/p002.gif",
。。
。 )
與
//——背景色——
var a_bkcolor = new Array
( "FFFFFF",
"fdd242",
"f8fead",
"a0e4a0",
。。
。 )
只是寫法的格式不同,其實都是定義變數數組。
好了,到現在為止,你已經完全理解了寒江322腳本的前516行的內容了(322腳本共1956行)。恭喜恭喜
下面我寫一點題外的話。腳本做為一種解釋性的語言,與真正的程序還是有一定的差距的,從我的感覺來看,寫腳本是一種應用,而寫程序是一種開發。沒有腳本可以寫成一個系統,而程序可以,另外,寫程序有很多的藝術性在裡面。就象畫一幅山水畫一樣,創作的是一種意境,而不是一顆樹的外形。寫這些話的目的是想表達我的一個想法:腳本既然只是一種應用,那麼就把它共享吧,不要讓它帶有更多的商業目的。
我所學到的腳本知識(五)附:出擊代碼
從第517行開始,會涉及到JS語句了。其實語句也沒有什麼,萬事開頭難,已經學會500多行了,還難個啥呀。
(部分同志可能還對第(三)篇的內容還暈乎著呢。今天開始就會讓你一點點清醒了。)
先打個比方:
1、把寒江腳本看做一座樓(注意:是樓,不是平房,有住「別野」的一邊涼快去)
2、這座樓分四層(就是我前所說的,332腳本的四個部分。)
3、每層樓會有多個房間(就是各個功能函數)
4、每個房間又會有具體的工作和職責(就是各子功能函數)
5、每個房間里的人,暫且看做各個變數吧。
下面以一段332腳本的函數來說明一下
function add_new_element()//加入新的界面元素
{ 。
。
。
write_button("","歡迎",409,60,35,20,"","快速歡迎","autosend(a_welcome)");
。
。
。
}
這段代碼的add_new_element 是一個功能函數(也就是自己定製的一個任務,目的就是在聊天室的輸入區加入新的界面元素。)
從「{」開始,到「}」結束
在「{」與「}」之間的內容是add_new_element 功能函數的各項具體工作。例如:write_button(...)、write_bkcolor_select(...)、
write_select(...)等等。
而write_button(...)這些又是一些功能函數,這一函數的具體功能是在腳本第1010-1014行的
function write_button(name,value,left,top,width,height,color,title,action) 中。
而1010-1014行的
function write_button(name,value,left,top,width,height,color,title,action)//加入執行一個函數的按鈕
{ write_button_style(name,left,top,width,height,color,title,"");
document.write(' onclick="' + action + '">'+ value +'</button>');
}
這段代碼又包含了write_button_style(...)功能函數。
這樣一層套一層的,有時容易給人套迷糊,但其實這就象是一個大工作,裡面又分很多小的工作,每一個小的工作裡面又會分為幾個小
的工作一樣。
你晚上回家做飯的時候,不能光做飯不做菜吧?所以做飯其實是做飯和做菜兩樣工作。做菜也不能就一個菜吧?(那也喝不進去小酒啊
),標准再低,也得弄個四菜一湯啥的呀,這每道菜就又是一項工作了。[依吾政府提醒廣大社員:喝多酒有害身體健康!]
那麼為什麼有些功能函數後面的括弧里要加那麼多字母、數字呢?這些字母和數字就是第一篇我們提到的變數,它的作用就好像某一項
任務在分配之前先指定幾個人去做一樣。
象 write_button_style(name,left,top,width,height,color,title,"");
的意思就是:write_button_style這個任務指派name,left,top,width,height,color,title,""這幾個人去做,最後一個""的意思是空缺
,因為每個功能函數是事先定義好的,本來需要五個變數的,你非得派四個變數去,那對不起,你得寫一個""來表示缺一個變數,(到
時候算獎金也得多給一份不是。)
至於具體的瀏覽器怎麼去找那段代碼,怎麼去執行,你就不用操心了,瀏覽器會象領導查檢勞動紀律一樣,從頭走到尾。(領導的事最
好別管,把自己的工作干好就成,出了事讓領導去兜著。)
以上這段如果看明白了,那332腳本裡面的功能函數你就都可以理出一個大體的思路了。至於細節問題如「typeof(parent.r.listhtml)
」「document.inputform.USER...」這些都先不用管。
5. 跪求一個夢幻西遊野外砍尾數的腳本#52都輸幾千RMB了#52 有的MM我,我高價收購#32 只要腳本,其他技巧不要
沒有腳本,只有技巧。100塊錢買來的,現在分享給你吧。
大家最關心的就是自身的傷害,如何調整自身的傷害達到最佳呢!必中的武器是百分100命中可以打出穩定的傷害,絕殺武器可以把氣血低於自身乘以20擊飛,但是其中2種武器對於尾數的大小沒多少關系,因人而定.最關鍵是自身的傷害和怪物防禦值問題。我經過長時間實驗得出,野外怪的防禦值在50左右,偏差很小。這就可以計算出我們的傷害對怪的傷害是多少。這個地址 http://xyq.17173.com/jsq/jsq06.htm可以看出你當前傷害對怪的大概范圍,這個可以參考下。大家都可以明白傷害越高越容易對低等級怪出現暴擊,傷害越低可以控制越穩定的輸出,穩定輸出就是我們調整的固定傷害。往往砍的尾數跟武器的總傷有很大關系,這個怎麼判定呢,拿上武器的傷害數值減去拿下武器的自身的傷害數值,就是你武器的傷害。武器總傷害數值尾數保持8.9。而且武器又分傷害和命中,傷害最理想尾數是8.例如(傷害388命中600=武器總傷588).而自身傷害(就是不拿武器)我調成數值(最好是尾數8.9.0).人物帶武器總傷尾數也控制在(6.7.8)這個規律給我帶來穩定的收入!而單單看自身總傷害的尾數作用不大!而LG.FC這些職業潛力點不加力量,他們的傷害能控制在1000以內!傷害相對穩定!任何不是物理攻擊職業,傷害力都可以說穩定的,至於傷害可以理解為是總傷害上下浮動的,正常合理范圍是上下3點左右,所以我弄成8,其范圍就是5678901這個樣子,長期實踐的概率!
6. 關於如何學習shell腳本,該怎麼寫
1. linux 腳本編寫基礎
1.1 語法基本介紹
1.1.1 開頭
程序必須以下面的行開始(必須方在文件的第一行):
#!/bin/sh
符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。
當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
要使腳本可執行:
編譯 chmod +x filename 這樣才能用./filename 來運行
1.1.2 注釋
在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結束。我們真誠地建議您在程序中使用注釋。
如果您使用了注釋,那麼即使相當長的時間內沒有使用該腳本,您也能在很短的時間內明白該腳本的作用
及工作原理。
1.1.3 變數
在其他編程語言中您必須使用變數。在shell編程中,所有的變數都由字元串組成,並且您不需要對變數
進行聲明。要賦值給一個變數,您可以這樣寫:
#!/bin/sh
#對變數賦值:
a="hello world"
# 現在列印變數a的內容:
echo "A is:"
echo $a
有時候變數名很容易與其他文字混淆,比如:
num=2
echo "this is the $numnd"
這並不會列印出"this is the 2nd",而僅僅列印"this is the ",因為shell會去搜索變數numnd的值,
但是這個變數時沒有值的。可以使用花括弧來告訴shell我們要列印的是num變數:
num=2
echo "this is the ${num}nd"
這將列印: this is the 2nd
1.1.4 環境變數
由export關鍵字處理過的變數叫做環境變數。我們不對環境變數進行討論,因為通常情況下僅僅在登錄
腳本中使用環境變數。
1.1.5 Shell命令和流程式控制制
在shell腳本中可以使用三類命令:
1)Unix 命令:
雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來
進行文件和文字操作的。
常用命令語法及功能
echo "some text": 將文字內容列印在屏幕上
ls: 文件列表
wc –l filewc -w filewc -c file: 計算文件行數計算文件中的單詞數計算文件中的字元數
cp sourcefile destfile: 文件拷貝
mv oldname newname : 重命名文件或移動文件
rm file: 刪除文件
grep 'pattern' file: 在文件內搜索字元串比如:grep 'searchstring' file.txt
cut -b colnum file: 指定欲顯示的文件內容範圍,並將它們輸出到標准輸出設備比如:輸出
每行第5個到第9個字元cut -b5-9 file.txt千萬不要和cat命令混淆,
這是兩個完全不同的命令
cat file.txt: 輸出文件內容到標准輸出設備(屏幕)上
file somefile: 得到文件類型
read var: 提示用戶輸入,並將輸入賦值給變數
sort file.txt: 對file.txt文件中的行進行排序
uniq: 刪除文本文件中出現的行列比如: sort file.txt | uniq
expr: 進行數學運算Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比如:根據文件名搜索find . -name filename -print
tee: 將數據輸出到標准輸出設備(屏幕) 和文件比如:somecommand | tee outfile
basename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tux
dirname file: 返迴文件所在路徑比如:dirname /bin/tux將返回 /bin
head file: 列印文本文件開頭幾行
tail file : 列印文本文件末尾幾行
sed: Sed是一個基本的查找替換程序。可以從標准輸入(比如命令管道)讀入文本,並將
結果輸出到標准輸出(屏幕)。該命令採用正則表達式(見參考)進行搜索。
不要和shell中的通配符相混淆。比如:將linuxfocus 替換為
LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
awk: awk 用來從文本文件中提取欄位。預設地,欄位分割符是空格,可以使用-F指定其他分割符。
cat file.txt | awk -F, '{print $1 "," $3 }'這里我們使用,作為欄位分割符,同時列印
第一個和第三個欄位。如果該文件內容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA
命令輸出結果為:Adam Bor, IndiaKerry Miller, USA
2) 概念: 管道, 重定向和 backtick
這些不是系統命令,但是他們真的很重要。
管道 (|) 將一個命令的輸出作為另外一個命令的輸入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有」hello」的行並計算其行數。
在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。
重定向:將命令的結果輸出到文件,而不是標准輸出(屏幕)。
> 寫入文件並覆蓋舊文件
>> 加到文件的尾部,保留舊文件內容。
反短斜線
使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數。
命令:
find . -mtime -1 -type f -print
用來查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。如果您
想將所有查找到的文件打一個包,則可以使用以下腳本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
3) 流程式控制制
1.if
"if" 表達式 如果條件為真則執行then後面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字元串、判斷文件
是否存在及是否可讀等等…
通常用" [ ] "來表示條件測試。注意這里的空格很重要。要確保方括弧的空格。
[ -f "somefile" ] :判斷是否是一個文件
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權
[ -n "$var" ] :判斷$var變數是否有值
[ "$a" = "$b" ] :判斷$a和$b是否相等
執行man test可以查看所有測試表達式可以比較和判斷的類型。
直接執行以下腳本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
變數$SHELL包含了登錄shell的名稱,我們和/bin/bash進行了比較。
快捷操作符
熟悉C語言的朋友可能會很喜歡下面的表達式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
這里 && 就是一個快捷操作符,如果左邊的表達式為真則執行右邊的語句。
您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow文件存在
則列印」 This computer uses shadow passwors」。同樣或操作(||)在shell編程中也是
可用的。這里有個例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
該腳本首先判斷mailfolder是否可讀。如果可讀則列印該文件中的"From" 一行。如果不可讀
則或操作生效,列印錯誤信息後腳本退出。這里有個問題,那就是我們必須有兩個命令:
-列印錯誤信息
-退出程序
我們使用花括弧以匿名函數的形式將兩個命令放到一起作為一個命令使用。一般函數將在下文提及。
不用與和或操作符,我們也可以用if表達式作任何事情,但是使用與或操作符會更便利很多。
2.case
case :表達式可以用來匹配一個給定的字元串,而不是數字。
case ... in
...) do something here ;;
esac
讓我們看一個例子。 file命令可以辨別出一個給定文件的文件類型,比如:
file lf.gz
這將返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我們利用這一點寫了一個叫做smartzip的腳本,該腳本可以自動解壓bzip2, gzip 和zip 類型的壓縮文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到我們在這里使用了一個特殊的變數$1。該變數包含了傳遞給該程序的第一個參數值。
也就是說,當我們運行:
smartzip articles.zip
$1 就是字元串 articles.zip
3. selsect
select 表達式是一種bash的擴展應用,尤其擅長於互動式使用。用戶可以從一組不同的值中進行選擇。
select var in ... ; do
break
done
.... now $var can be used ....
下面是一個例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是該腳本運行的結果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
4.loop
loop表達式:
while ...; do
....
done
while-loop 將運行直到表達式測試為真。will run while the expression that we test for is true.
關鍵字"break" 用來跳出循環。而關鍵字」continue」用來不執行餘下的部分而直接跳到下一個循環。
for-loop表達式查看一個字元串列表 (字元串用空格分隔) 然後將其賦給一個變數:
for var in ....; do
....
done
在下面的例子中,將分別列印ABC到屏幕上:
#!/bin/sh
for var in A B C ; do
echo "var is $var"
done
下面是一個更為有用的腳本showrpm,其功能是列印一些RPM包的統計信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
if [ -r "$rpmpackage" ];then
echo "=============== $rpmpackage =============="
rpm -qi -p $rpmpackage
else
echo "ERROR: cannot read file $rpmpackage"
fi
done
這里出現了第二個特殊的變數$*,該變數包含了所有輸入的命令行參數值。
如果您運行showrpm openssh.rpm w3m.rpm webgrep.rpm
此時 $* 包含了 3 個字元串,即openssh.rpm, w3m.rpm and webgrep.rpm.
5. 引號
在向程序傳遞任何參數之前,程序會擴展通配符和變數。這里所謂擴展的意思是程序會把通配符
(比如*)替換成合適的文件名,它變數替換成變數值。為了防 止程序作這種替換,您可以使用
引號:讓我們來看一個例子,假設在當前目錄下有一些文件,兩個jpg文件, mail.jpg 和tux.jpg。
1.2 編譯SHELL腳本
#ch#!/bin/sh mod +x filename
cho *.jpg ∪緩螅 梢醞ü 淙耄?./filename 來執行您的腳本。
這將列印出"mail.jpg tux.jpg"的結果。
引號 (單引號和雙引號) 將防止這種通配符擴展:
#!/bin/sh
echo "*.jpg"
echo '*.jpg'
這將列印"*.jpg" 兩次。
單引號更嚴格一些。它可以防止任何變數擴展。雙引號可以防止通配符擴展但允許變數擴展。
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo '$SHELL'
運行結果為:
/bin/bash
/bin/bash
$SHELL
最後,還有一種防止這種擴展的方法,那就是使用轉義字元——反斜桿:
echo *.jpg
echo $SHELL
這將輸出:
*.jpg
$SHELL
6. Here documents
當要將幾行文字傳遞給一個命令時,here documents(譯者註:目前還沒有見到過對該詞適合的翻譯)
一種不錯的方法。對每個腳本寫一段幫助性的文字是很有用的,此時如果我們四有那個 here documents
就不必用echo函數一行行輸出。 一個 "Here document" 以 shift by 2
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
您可以這樣運行該腳本:
cmdparser -l hello -f -- -somefile1 somefile2
返回的結果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
這個腳本是如何工作的呢?腳本首先在所有輸入命令行參數中進行循環,將輸入參數
與case表達式進行比較,如果匹配則設置一個變數並且移除該參數。根據unix系統的慣例,
首先輸入的應該是包含減號的參數.
第2部分 實例
現在我們來討論編寫一個腳本的一般步驟。任何優秀的腳本都應該具有幫助和輸入參數。並且寫一個偽腳本(framework.sh),該腳本包含了大多數腳本都需要的框架結構,是一個非常不錯的主意。這時候,在寫一個新的腳本時我們只需要執行一下命令:
cp framework.sh myscript
然後再插入自己的函數。
讓我們再看兩個例子:
二進制到十進制的轉換
腳本 b2d 將二進制數 (比如 1101) 轉換為相應的十進制數。這也是一個用expr命令進行數學運算的例子:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat <
b2h -- convert binary to decimal
USAGE: b2h [-h] binarynum
OPTIONS: -h help text
EXAMPLE: b2h 111010
will return 58
HELP
exit 0
}
error()
{
# print an error and exit
echo "$1"
exit 1
}
lastchar()
{
# return the last character of a string in $rval
if [ -z "$1" ]; then
# empty string
rval=""
return
fi
# wc puts some space behind the output this is why we need sed:
numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
# now cut out the last char
rval=`echo -n "$1" | cut -b $numofchar`
}
chop()
{
# remove the last character in string and return it in $rval
if [ -z "$1" ]; then
# empty string
rval=""
return
fi
# wc puts some space behind the output this is why we need sed:
numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
if [ "$numofchar" = "1" ]; then
# only one char in string
rval=""
return
fi
numofcharminus1=`expr $numofchar "-" 1`
# now cut all but the last char:
rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
}
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
--) shift;break;; # end of options
-*) error "error: no such option $1. -h for help";;
*) break;;
esac
done
# The main program
sum=0
weight=1
# one arg must be given:
[ -z "$1" ] && help
binnum="$1"
binnumorig="$1"
while [ -n "$binnum" ]; do
lastchar "$binnum"
if [ "$rval" = "1" ]; then
sum=`expr "$weight" "+" "$sum"`
fi
# remove the last position in $binnum
chop "$binnum"
binnum="$rval"
weight=`expr "$weight" "*" 2`
done
echo "binary $binnumorig is decimal $sum"
該腳本使用的演算法是利用十進制和二進制數權值 (1,2,4,8,16,..),比如二進制"10"可以這樣轉換成十進制:
0 * 1 + 1 * 2 = 2
為了得到單個的二進制數我們是用了lastchar 函數。該函數使用wc –c計算字元個數,然後使用cut命令取出末尾一個字元。Chop函數的功能則是移除最後一個字元。
文件循環程序
或許您是想將所有發出的郵件保存到一個文件中的人們中的一員,但是在過了幾個月
以後,這個文件可能會變得很大以至於使對該文件的訪問速度變慢。下面的 腳本rotatefile
可以解決這個問題。這個腳本可以重命名郵件保存文件(假設為outmail)為outmail.1,
而對於outmail.1就變成了outmail.2 等等等等...