Linux上的Shell之FAQ
生活随笔
收集整理的這篇文章主要介紹了
Linux上的Shell之FAQ
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:http://blog.chinaunix.net/u3/93926/showart_1874897.html
●為什么使用Shell編程? 簡單快捷,適用性廣
●Shell中變量的表示方法是什么? 在Shell中,一般在名字前加$表示變量,例如: $ first = Hello $ echo $first Hello
●Shell中的布爾測試命令是什么?其用法怎樣? Shell中的布爾測試與一般編程語言有所不同,有兩個(gè)命令可以表示(它們其實(shí)是同一個(gè)命令,只是表示方法不同而已):test和[(這不是左括號(hào)嗎?也算命令嗎?答案是肯定的,不信你可以去檢查ls -l /usr/bin/[。還要注意一點(diǎn)的是,通常使用[表示時(shí),會(huì)在測試完成后加上一個(gè)],其實(shí)這只是為了可讀性而增加的,沒有實(shí)際意義)。例如: if test –f my.txt 和 if [ -f my.txt ] 都表示測試文件my.txt是否存在。(注意[與-f之間必須有空格) 使用布爾測試符測試的條件類型包含三類:字符串測試/算術(shù)測試/文件測試,具體分為: 1)字符串測試 ①string1 = string2?????????? 測試兩字符串是否相等 ②string1 != string2?????????????????? 測試兩字符串是否不等 ③-n string????????????????????????? 測試字符串是否不為空 ④-z string?????????????????????????? 測試字符串是否為空 2)算術(shù)測試 ①expr1 -eq expr2???????????? 測試兩表達(dá)式是否相等 ②expr1 -ne expr2???????????? 測試兩表達(dá)式是否不等 ③expr1 -gt expr2???????????? 測試expr1是否大于expr2 ④expr1 -ge expr2???????????? 測試expr1是否大于等于expr2 ⑤expr1 -lt expr2?????????????? 測試expr1是否小于expr2 ⑥expr1 -le expr2????????????? 測試expr1是否小于等于expr2 ⑦!expr??????????????????????????????? 測試表達(dá)式是否為假 3)文件測試 ①-d file??????????????????????????????? 測試該文件是否為目錄 ②-e file??????????????????????????????? 測試該文件是否存在,但該選項(xiàng)可移植性不好,通常改用-f ③-f file???????????????????????????????? 測試該文件是否為常規(guī)文件 ④-g file??????????????????????????????? 測試該文件是否設(shè)置了set-group-id ⑤-r file??????????????????????????????? 測試該文件是否可讀 ⑥-s file??????????????????????????????? 測試該文件是否不空 ⑦-u file??????????????????????????????? 測試該文件是否設(shè)置了set-user-id ⑧-r file??????????????????????????????? 測試該文件是否可寫 ⑨-x file??????????????????????????????? 測試該文件是否可執(zhí)行
●Shell中的語句鏈表是怎樣的? Shell中有一項(xiàng)比較特殊的用法,就是將多個(gè)語句串聯(lián)在一起,這樣可以使編程更為簡潔。這些語句的串聯(lián)通常是條件測試語句,一般用兩個(gè)符號(hào)來組織它們:&&(表示與)和||(表示或)。&&鏈表可以連接一組命令,當(dāng)&&前面的命令都成功時(shí),才執(zhí)行&&后面的命令。而||鏈表則當(dāng)其中一條命令成功時(shí),即退出。這兩個(gè)符號(hào)甚至還可以鏈接語句集,只要你把這些語句用{}包圍就好了。
●Shell中關(guān)于set這個(gè)命令的用法是怎樣的? set這個(gè)命令主要用來設(shè)置參數(shù)變量,這在輸出以空格分隔的值時(shí)很有用。
●為什么使用Shell編程? 簡單快捷,適用性廣
?
●什么是Shell? Shell是用戶和Linux系統(tǒng)之間的接口程序,你可以通過它輸入命令以使操作系統(tǒng)執(zhí)行。?
●文件描述符0,1,2分別表示什么? 在Shell中, 0表示標(biāo)準(zhǔn)輸入,1表示標(biāo)準(zhǔn)輸出,2表示標(biāo)準(zhǔn)錯(cuò)誤輸出。?
●>>符號(hào)的作用? 在文件后添加時(shí),使用>>,如:ps >> output.txt,這樣ps的結(jié)果會(huì)添加在output.txt文件的最后,而不會(huì)沖掉文件中原有的內(nèi)容。?
●Shell命令中常見2>&1,這是什么意思? 在Shell中,>符號(hào)常用來表示重定向輸出,前面可用文件描述符表示重定向什么輸出,默認(rèn)為1(即標(biāo)準(zhǔn)輸出),如果是重定向標(biāo)準(zhǔn)錯(cuò)誤輸出,則使用2>,后面如果為&1,則表示將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到與標(biāo)準(zhǔn)輸出的同一位置。?
●/dev/null的作用? 如果在Shell命令中,你希望把輸出的結(jié)果丟棄,那么可以直接扔到Linux的垃圾桶里,/dev/null就是這樣一個(gè)垃圾桶。例如:kill -l 214 > /dev/null?
●怎樣重定向輸入? 在shell中重定向輸入使用的是<符號(hào),例如:more < ex.txt?
●為什么需要管道?管道怎么使用? Shell中管道(pipe)功能很強(qiáng)大,可用來鏈接命令,實(shí)現(xiàn)流水線操作。管道這個(gè)名字很形象,它就是命令之間的連接渠道。在使用管道時(shí),你把前一個(gè)命令的輸出和后一個(gè)命令的輸入對應(yīng)地接在一起就行了,使用的符號(hào)是“|”。例如:ps | sort | grep -v init | more?
●Shell中的通配符 Shell中的通配符功能也挺強(qiáng)大的,主要有如下幾類: 1)*:匹配任意字符 2)?:匹配單個(gè)字符 3)[集合]:匹配集合中的字符 4)[^集合]:匹配不在集合中的字符 5){}:匹配{}中的內(nèi)容?
●` `符號(hào)的作用 在Shell中,一對` `符號(hào)表示把包含其中的內(nèi)容以Shell命令的方式執(zhí)行,注意與普通引號(hào)之間的差別。例如:more `grep -l POSIX *`?
●關(guān)于Shell腳本的寫法 Shell腳本的編寫需要注意如下基本要點(diǎn): 1)第一行以注釋開始,實(shí)際上這是一行特殊的注釋,#!表示其后列出的是執(zhí)行該腳本的程序,例如:#!/bin/bash,表示該腳本用/bin/bash程序來解釋執(zhí)行。 2)最后一行使用exit命令結(jié)束,以確保腳本能以正常方式退出。?
●給Shell腳本賦予執(zhí)行權(quán)限 剛編輯好的Shell腳本是不能直接運(yùn)行的,如果你希望通過./shellfile的方式運(yùn)行它,就需要給腳本賦予執(zhí)行權(quán)限,通常的做法是:chmod +x shellfile,也可以根據(jù)不同的權(quán)限要求,對指定的用戶授予權(quán)限,如:chmod 766 shellfile(另一種格式:chmod o+x shellfile),則該shellfile文件只有其所有者用戶(owner)才能直接執(zhí)行。●Shell中變量的表示方法是什么? 在Shell中,一般在名字前加$表示變量,例如: $ first = Hello $ echo $first Hello
?
●Shell中可否直接從標(biāo)準(zhǔn)輸入讀入變量? 答案是肯定的,而且實(shí)現(xiàn)的方法也很簡單,用read命令就好,例如: $ read yourname Wang Tian $ echo $yourname Wang Tian?
●Shell中引號(hào)使用時(shí)的注意事項(xiàng)是什么? 在Shell中使用單引號(hào)和雙引號(hào)要特別注意如下一個(gè)區(qū)別:單引號(hào)所包含的字符串里若含有變量($var),不作替換處理,而雙引號(hào)所包含的字符串則會(huì)自動(dòng)進(jìn)行變量的替換。例如: $ myname = “Li Xi” $ echo “My name is $myname.” My name is Li Xi. $ echo ‘My name is not $myname.” My name is not $myname.?
●Shell中的環(huán)境變量有哪些?它們各有什么作用? 環(huán)境變量在實(shí)際Shell編程中廣泛使用,是需要重點(diǎn)掌握的。現(xiàn)在只介紹幾個(gè)主要的常用的變量: 1)$HOME? ? 當(dāng)前用戶的主目錄 2)$PATH???????? 命令的搜索路徑 3)$PS1??????????? 命令提示符,就是你在Linux命令行下那個(gè)總出現(xiàn)的提示符,通常是$,也可能定制成其他類型。 4)$PS2??????????? 第二命令提示符,比如當(dāng)你輸入的命令需要接受輸入時(shí),也會(huì)給出一個(gè)提示符,通常為> 5)$IFS???????????? 輸入字段分隔符,就是當(dāng)你讀入信息時(shí)用來將字符串分隔為單詞的符號(hào),通常為空格、制表符以及回車符號(hào)。 6)$0??????????????? 所執(zhí)行的Shell腳本的名字 7)$#??????????????? Shell腳本(命令)傳遞的參數(shù)個(gè)數(shù) 8)$$??????????????? 所執(zhí)行的Shell腳本的進(jìn)程號(hào),通常用來生成唯一的臨時(shí)文件名?
●Shell中的參數(shù)變量有哪些?它們各有什么作用? 參數(shù)變量與環(huán)境變量同樣重要,當(dāng)你編寫的腳本需要調(diào)用參數(shù)時(shí),系統(tǒng)會(huì)自動(dòng)為你創(chuàng)建這些參數(shù)變量,如果不需要傳遞參數(shù),上面的環(huán)境變量$#的值會(huì)設(shè)為0。參數(shù)變量比較簡單,就有三個(gè)而已: 1)$1, $2, …???????????? 傳遞給腳本的參數(shù)1,2,… 2)$*????????????????????????? 所有參數(shù)的一個(gè)列表,參數(shù)之間用IFS中所定義的第一個(gè)分隔符分隔 3)$@??????????????????????? $*的一個(gè)變種,它不使用IFS環(huán)境變量的分隔符,即使IFS為空,也不影響其表示。所以這是比$*更好的一種表示方式。●Shell中的布爾測試命令是什么?其用法怎樣? Shell中的布爾測試與一般編程語言有所不同,有兩個(gè)命令可以表示(它們其實(shí)是同一個(gè)命令,只是表示方法不同而已):test和[(這不是左括號(hào)嗎?也算命令嗎?答案是肯定的,不信你可以去檢查ls -l /usr/bin/[。還要注意一點(diǎn)的是,通常使用[表示時(shí),會(huì)在測試完成后加上一個(gè)],其實(shí)這只是為了可讀性而增加的,沒有實(shí)際意義)。例如: if test –f my.txt 和 if [ -f my.txt ] 都表示測試文件my.txt是否存在。(注意[與-f之間必須有空格) 使用布爾測試符測試的條件類型包含三類:字符串測試/算術(shù)測試/文件測試,具體分為: 1)字符串測試 ①string1 = string2?????????? 測試兩字符串是否相等 ②string1 != string2?????????????????? 測試兩字符串是否不等 ③-n string????????????????????????? 測試字符串是否不為空 ④-z string?????????????????????????? 測試字符串是否為空 2)算術(shù)測試 ①expr1 -eq expr2???????????? 測試兩表達(dá)式是否相等 ②expr1 -ne expr2???????????? 測試兩表達(dá)式是否不等 ③expr1 -gt expr2???????????? 測試expr1是否大于expr2 ④expr1 -ge expr2???????????? 測試expr1是否大于等于expr2 ⑤expr1 -lt expr2?????????????? 測試expr1是否小于expr2 ⑥expr1 -le expr2????????????? 測試expr1是否小于等于expr2 ⑦!expr??????????????????????????????? 測試表達(dá)式是否為假 3)文件測試 ①-d file??????????????????????????????? 測試該文件是否為目錄 ②-e file??????????????????????????????? 測試該文件是否存在,但該選項(xiàng)可移植性不好,通常改用-f ③-f file???????????????????????????????? 測試該文件是否為常規(guī)文件 ④-g file??????????????????????????????? 測試該文件是否設(shè)置了set-group-id ⑤-r file??????????????????????????????? 測試該文件是否可讀 ⑥-s file??????????????????????????????? 測試該文件是否不空 ⑦-u file??????????????????????????????? 測試該文件是否設(shè)置了set-user-id ⑧-r file??????????????????????????????? 測試該文件是否可寫 ⑨-x file??????????????????????????????? 測試該文件是否可執(zhí)行
?
●Shell中的條件控制結(jié)構(gòu)是怎樣的? 編程語言中的條件控制結(jié)構(gòu)通常是if..then之類的,Shell也不例外。其格式如下: if 條件1 then ? 語句A elif 條件2 then? 語句B elif 條件3 then ? 語句C else ? 語句D fi?
●Shell中的循環(huán)控制結(jié)構(gòu)是怎樣的? Shell中的循環(huán)結(jié)構(gòu)也與其他編程語言類似。基本格式如下: 1)for循環(huán)(適于在字符串集中循環(huán),注意其與通常的for語句的差別) for 變量 in 值集??? do ? 語句 done 2)while循環(huán)(適于在數(shù)集中循環(huán)或條件測試) while 條件 do ? 語句 done 3)until語句(與while的條件判斷正好相反) until 條件 do ? 語句 done?
●關(guān)于case語句的用法是怎樣? case的結(jié)構(gòu)比較復(fù)雜,所以在這里單列出來。其基本格式為: case 變量 in ? 模式 [ | 模式] …) 語句A;; ? 模式 [ | 模式] …) 語句B;; ? … esac 看個(gè)例子吧: case “$dayofweek” in ? 1) echo “Today is Monday”;; ? 2) echo “Today is Tuesday”;; ? 3) echo “Today is Wednesday”;; ? 4) echo “Today is Thursday”;; ? 5) echo “Today is Friday”;; ? 6) echo “Today is Saturday”;; ? 7) echo “Today is Sunday”;; ? *) echo “Sorry, your input is wrong!”;; esac●Shell中的語句鏈表是怎樣的? Shell中有一項(xiàng)比較特殊的用法,就是將多個(gè)語句串聯(lián)在一起,這樣可以使編程更為簡潔。這些語句的串聯(lián)通常是條件測試語句,一般用兩個(gè)符號(hào)來組織它們:&&(表示與)和||(表示或)。&&鏈表可以連接一組命令,當(dāng)&&前面的命令都成功時(shí),才執(zhí)行&&后面的命令。而||鏈表則當(dāng)其中一條命令成功時(shí),即退出。這兩個(gè)符號(hào)甚至還可以鏈接語句集,只要你把這些語句用{}包圍就好了。
?
●在Shell中怎么使用函數(shù)? Shell中的函數(shù)定義很簡單,基本格式為: 函數(shù)名() { ? 語句體 } 函數(shù)的使用需要注意的幾點(diǎn): 1)函數(shù)必須先定義才能調(diào)用 2)當(dāng)函數(shù)調(diào)用的時(shí)候,原來腳本的參數(shù),如$*,$@,$#,$1,$2等會(huì)被函數(shù)的相應(yīng)參數(shù)所替換,函數(shù)調(diào)用完成,它們的值則回歸到原值。 3)在函數(shù)內(nèi)部,可以使用local來定義局部變量,該變量僅在函數(shù)內(nèi)部有效。如果局部變量與全局變量同名,局部變量會(huì)在函數(shù)內(nèi)部替換全局變量。?
●Shell中是否也有break命令,是否也有continue命令? 答案是肯定的,和其他編程語言一樣,break用來直接跳出for, while或until循環(huán),而continue用來跳出for, while或until的當(dāng)前循環(huán)。?
●Shell中出現(xiàn):在單獨(dú)一行是什么意思? 有時(shí)我們可以看到,Shell腳本中出現(xiàn)一行僅包括一個(gè)冒號(hào),它的意思其實(shí)很簡單,這個(gè)冒號(hào)就等于布爾變量true。實(shí)際上,它運(yùn)行的速度比true還快。?
●Shell中的.做什么用? 別小看這個(gè).符號(hào),它實(shí)際很有用處,這是Shell中一個(gè)特殊的命令符,用來在指定Shell腳本環(huán)境里執(zhí)行命令(腳本)。這有點(diǎn)類似于C中的#include,它可以切換到某個(gè)腳本環(huán)境下來執(zhí)行后續(xù)命令。其使用方法為:. ./script?
●Shell中eval命令的作用? eval命令用來求值。它會(huì)給出后面所接變量的值,這在多次賦值時(shí)很有用。?
●Shell中exec命令的作用? exec也是Shell中常用的命令,一般有兩個(gè)作用: 1)用不同的程序名替換當(dāng)前Shell腳本(主要功能) 2)修改當(dāng)前文件描述符(次要功能)?
●關(guān)于exit的用法還有什么? 我們常見的exit用來退出腳本運(yùn)行,exit 0表示成功退出,如果在exit后面加狀態(tài)碼1-125則表示有錯(cuò)誤發(fā)生,這些錯(cuò)誤可由程序指定,另外Shell還保留了一些狀態(tài)碼: 1)126?????????????????????? 文件不能執(zhí)行 2)127?????????????????????? 命令未找到 3)128及以上??????? 收到一個(gè)信號(hào)?
●Shell中export命令的作用? export命令的主要作用是導(dǎo)出環(huán)境變量,使得該環(huán)境變量能被其他腳本和程序所用。?
●Shell中expr命令的作用? expr的主要作用是將其后的參數(shù)看作表達(dá)式來求值。它可以完成許多表達(dá)式的運(yùn)算。●Shell中關(guān)于set這個(gè)命令的用法是怎樣的? set這個(gè)命令主要用來設(shè)置參數(shù)變量,這在輸出以空格分隔的值時(shí)很有用。
?
●Shell中關(guān)于shift這個(gè)命令的用法是怎樣的? 顧名思義,shift命令是用來移位的,具體來說,它可以讓參數(shù)變量向后移1位,比如,$2變成$1,$3變成$2,等等。需要注意的是,移位一次都會(huì)丟掉一個(gè)參數(shù)值。?
●Shell中關(guān)于trap這個(gè)命令的用法是怎樣的? trap命令用來指定當(dāng)接收到某種信號(hào)時(shí)采取什么行動(dòng),可用來處理中斷信息。其基本格式為: trap 命令動(dòng)作 信號(hào) 最常用的幾種信號(hào): 1)HUP(1)????????????????????????? 掛起;通常當(dāng)終端斷開連接時(shí),或用戶退出登錄時(shí)發(fā)生。 2)INT(2)??????????????????????????? 中斷;通常在鍵入Ctrl+C時(shí)發(fā)生。 3)QUIT(3)???????????????????????? 退出;通常在鍵入Ctrl+\時(shí)發(fā)生。 4)ABRT(6)??????????????????????? 放棄;通常因遇到某種嚴(yán)重執(zhí)行錯(cuò)誤時(shí)發(fā)生。 5)ALRM(14)???????????????????? 警告;通常由于計(jì)時(shí)器超時(shí)而發(fā)生。 6)TERM(15)???????????????????? 終止;通常當(dāng)系統(tǒng)關(guān)閉時(shí)發(fā)生。 如果將trap設(shè)置為默認(rèn)動(dòng)作,可以在命令處設(shè)置為-,如果要忽略該信號(hào),可將命令設(shè)置為空串’ ‘。?
●Shell中關(guān)于unset這個(gè)命令的用法是怎樣的? unset命令用來在環(huán)境變量表中刪除一個(gè)變量,它對系統(tǒng)定義的只讀變量沒有作用。?
●在Shell中出現(xiàn)$((…))是什么意思? $((…))的表示是與expr同義的,用于表達(dá)式求值,但是它比expr更新,效率也更高。例如: x=0 x=$(($x+1)) 注意其與$(…)的區(qū)別,$(…)是用來得到括號(hào)內(nèi)所執(zhí)行的命令的輸出結(jié)果。?
●在Shell中什么是參數(shù)擴(kuò)展(Parameter Expansion)? 參數(shù)擴(kuò)展是Shell中比較有特色的一項(xiàng)內(nèi)容,它為參數(shù)的設(shè)置提供了額外的方法。通常形式是${參數(shù)}。常用的方法有: 1)${param:-default}????? 如果param為空,則設(shè)置其值等于default。 2)${#param}??????????????????? 求得param的長度。 3)${param%word}???????? 從末尾開始,刪除param中與word匹配的最近部分,然后返回其余。 4)${param%%word}????? 從末尾開始,刪除param中與word匹配的最遠(yuǎn)部分,然后返回其余。 5)${param#word}????????? 從起首開始,刪除param中與word匹配的最近部分,然后返回其余。 6)${param##word}??????? 從起首開始,刪除param中與word匹配的最遠(yuǎn)部分,然后返回其余。?
●在Shell中<<有什么特殊作用? 注意這個(gè)<<,它的作用很有意思,其后跟隨的是一個(gè)特殊的字符序列,此后的內(nèi)容就看作是從文件或鍵盤輸入的一樣,在這些內(nèi)容的末尾再加上一個(gè)與開頭相同的字符序列。這在Shell中稱為“here document”。例如: cat <<!nomeaning! This is my book !nomeaning! 輸出為: This is my book總結(jié)
以上是生活随笔為你收集整理的Linux上的Shell之FAQ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。