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