SHELL指令碼的基礎知識 處理使用者輸入

2021-05-25 03:10:55 字數 3089 閱讀 8502

當指令碼需要與執行指令碼的人員進行互動。

bash shell提供了命令列引數(新增在命令後面的資料值)、命令列選項(修改命令行為的單字元值)和直接讀取鍵盤輸入。

向shell指令碼傳遞資料的最基本方式是使用命令列引數

讀取輸入的引數的變數為位置引數,位置引數通過標準數字表示,

其中$0為程式名稱,$1為第乙個引數,$2為第二個引數,依次類推,直到$9為第九個引數。

shell指令碼自動將命令列引數賦值給各個位置變數。

同時輸入多個引數(可以是數值也可以是字串)時,必須使用空格分隔(要想在引數值中包含空格,就必須使用單引號或雙引號)

當引數多於9個後,必須在shell指令碼內使用大括號將變數括起來,如$。從而可以使用任意個引數。

傳遞給變數$0的字串實際上是程式的路徑(根據呼叫方法決定是相對還是絕對路徑)。

使用basename命令可以去掉路徑字首,只獲得程式名稱(名字中不可以有空格)。

當指令碼認為應該包含引數,卻實際上沒有資料時,就會出錯。

好的方法是對引數進行檢查來保證使用引數前確實存在資料,可以使用-n引數來檢查。

ex: if [ –n 「$1」 ] then .. else .. fi

用於跟蹤命令列引數

使用特殊變數$#測試執行指令碼時包含的命令列引數個數。指令碼中任何位置都可以使用$#

ex: if [ $# –ne 2 ] 即可測試引數個數

可以使用$來返回最後乙個命令列引數(當無引數時,$#為0,而$為程式名)

變數$*將命令列中提供的所有引數作為乙個單詞處理,它將多個引數看成乙個引數。

變數$@將命令列中提供的所有引數作為同乙個字串中的多個單詞處理。允許對其中的值進行迭代(一般使用for),分隔開不同引數

shift命令能夠改變命令列引數的相對位置。預設將每個引數變數左移乙個位置(變數$0不變,把$1丟棄,注意不可以恢復了!)

在不清楚引數數目情況下,這是乙個迭代引數的好辦法

可以為shift提供乙個引數,來實現多位移變化

選項是由破折號引導的單個字母,用於更改命令的行為。

1)處理簡單選項

可以使用處理命令列引數相同的方法處理選項,抽取時使用case語句進行判斷是否符合選項格式。

2)從引數中分離選項

同時使用選項和引數時,可以使用--指示選項列表的結束。發現--後,shell就知道後面的是普通引數了,停止使用case處理選項。

3)處理帶值的選項

選項後緊跟引數值,一種方法是在case中對應選項後使用shift和讀後一位引數的方法處理。更好的方法如下:

getopt命令在處理選項和引數時非常方便。它對引數進行重新組織,以便於解析

1)命令格式

getopt可以接受任意形式的選項和引數列表,並自動將它們轉換為適當的格式。

命令格式為:getopt options optstring parameters

選項字串(opstring)用於定義命令列中的有效選項字母,以及哪些選項字母需要引數值。

2)指令碼中使用getopt

需要使用set命令將現有的命令列選項和引數替換為getopt命令生成的格式化形式。

需要將原始指令碼命令列引數送給getopt命令,然後將getopt命令輸出送給set命令,如下:set – `getopts –q ab:cd 「$@」`

但是getopt命令不能很好的處理帶有空格的引數值,它將空格解析為引數分隔符,而不是將雙引號引起來的兩個值合併成乙個引數。解決辦法如下:

getopts命令順序的對現有的shell引數變數進行處理,每呼叫一次,只處理命令中檢測到的引數中的乙個。處理完所有引數後,以大於0的退出狀態退出。

非常適宜於在迴圈中解析所有命令列引數

格式為: getopts optstring variable

$optarg包含需要引數值的選項要使用的值,$optind包含getopts停止處理時在引數列表中的位置。

注意:當getopts處理時,會將選項前的-去掉,所以對應的case中不需要破折號。

好的特性:

1)可以在引數值中包含空格

2)選項字母和引數值中間可以沒有空格

3)將在命令列中找到的未定義的選項都繫結為單一的輸出——問號

有一些字母選項具有標準含義。最好按照標準含義定義選項意義

-a –c –d –e –f –h –i –l –n –o –q –r –s –v- x –y

當需要在執行過程中獲得執行指令碼人員的輸入,使用read命令

read命令接受標準輸入或其他檔案描述符輸入。讀入後將資料放入乙個標準變數中。

-p允許在read命令列中直接指定乙個提示。

可以指定多個變數,也可以不指定(將放置在reply環境變數中)

使用-t指定乙個計時器,計時數滿還未輸入,read返回乙個非0的退出狀態。

使用-n指定輸入的字元個數,輸入達到預定數目時,就自動結束輸入

使用-s使輸入不顯示在終端(例如輸入密碼)

最常用的方法是使用cat命令,並通過管道傳給包含read的while語句。

ex: cat test | while read line

Shell指令碼基礎知識

shell 變數 命名規則 首字元為字母 中間不能有空格,可用下劃線 不能使用標點和bash的關鍵字 賦值 顯示命名 不能加 語句賦值 唯讀變數 readonly variable name 刪除變數 unset varible name 不能刪除唯讀變數 shell字串 字串可以用單引號 雙引號 ...

shell指令碼基礎知識

自定義shell變數時,變數有什麼規格?可以使用字母,數字,下劃線,不能以數字開頭 變數名區分大小寫 賦值時等號兩邊不要有空格 不要使用關鍵字或特殊字元,給同乙個變數多次賦值時,最後一次生效。簡述預定義變數 0 的作用?儲存當前執行的程式pid號 上乙個執行命令的返回狀態 0 當前執行的指令碼名 位...

shell指令碼基礎知識

雖然現在能在linux系統下生存,但是自覺效率太低,和高手有很大的差距。這就是關於linux的知識太過匱乏,有很多事情知道該怎麼做,但是就是沒法在linux下實現,為了提公升工作效率,必須要接觸linux高階技巧 linux的東西比較深,沒法一下學完,所以只要能掌握生信必備的基礎就好了。一些主要的流...