1. 程式人生 > >shell 指令碼中關於使用者輸入參…

shell 指令碼中關於使用者輸入參…

1、命令列引數

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

(1) 讀取引數

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

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

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

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

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

(2)讀取程式名稱

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

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

(3)測試指令碼

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

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

ex: if [ –n “$1” ] then .. else .. fi

2、特殊的引數變數

用於跟蹤命令列引數

(1)引數計數

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

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

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

(2)獲取所有資料

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

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

3、 移位

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

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

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

4、處理選項

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

(1)找出選項

1)處理簡單選項

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

2)從引數中分離選項

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

3) 處理帶值的選項

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

(2)使用getopt命 令

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

1)命令格式

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

命令格式為: getopt options optstring parameters

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

2)指令碼中使用getopt

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

需要將原始指令碼命令列引數送給getopt命令,然後將 getopt命令輸出送給set命令,如下:set – `getopts –q ab:cd “[email protected]”`

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

(3)更高階的getopts命令

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

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

格式為: getopts optstring variable

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

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

好的特性:

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

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

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

5、標準化選項

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

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

6、獲取使用者輸入

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

(1)基本讀取

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

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

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

(2)計 時

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

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

(3)默讀

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

(4)讀取檔案

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

ex: cat test | while read line

相關推薦

shell指令碼自動輸入密碼

在shell指令碼中需要用root用的來執行指令:sudo 自動輸入密碼echo "password" | sudo -S netstat -tlnp       -S          The -S (stdin) option causes sudo to read t

shell 指令碼關於使用者輸入

1、命令列引數 向shell指令碼傳遞資料的最基本方式是使用命令列引數。 (1) 讀取引數    讀取輸入的引數的變數為位置引數,位置引數通過標準數字表示,    其中$0為程式名稱,$1為第一個引數,$2為第二個引數,依次類推,直到$9為第九個引數。    shell指令碼自動將命令列引數賦值給各個位置變

解決 shell指令碼SCP命令需要輸入密碼的問題

本文轉自:https://blog.csdn.net/u012454773/article/details/72779439 使用金鑰檔案,兩臺機器建立信任 這裡假設主機A(192.168.100.3)用來獲得主機B(192.168.100.4)的檔案。 在主機A上執行如下命令來生成配對金鑰:

如何在shell指令碼實現 scp 檔案的時候不手動輸入密碼

在shell指令碼中實現 scp 檔案的時候不手動輸入密碼的指令碼如下: #!/usr/bin/expect -f set password 密碼 spawn scp 使用者名稱@目標機器ip:拷貝檔案的路徑 存放本地檔案的路徑  set timeout 300 

Shell指令碼實現將輸入的字元轉換為*

如果你需要寫一段與使用者互動,且需要輸入一些敏感資訊的(例如:使用者密碼、License等),那麼直接用printf+read的方式,就會把使用者輸入的資訊顯示在螢幕了,這是不符合資訊保安的,而且對客戶體驗來說也顯得不夠專業,所以就需要將使用者輸入的密碼轉換為*,樣式如下: please input

shell指令碼的for迴圈和while迴圈

基礎for迴圈有三種:         ①直接寫-------例如:for  i   in  1,2,3,4(注:i 是變數; in是在什麼地方;do和done之間是迴圈體)         &n

學習Linux shell指令碼連線字串的方法

這篇文章主要介紹了Linux shell指令碼中連線字串的方法,如果想要在變數後面新增一個字元,可以用一下方法: 程式碼如下: $value1=home $value2=${value1}"=" echo $value2 把要新增的字串變數新增{},並且需要把$放到外面。 這樣輸出的結果

shell指令碼$的用處

1.$0 獲取當前執行的shell指令碼的檔名,包括路徑。[[email protected] ~]# vi test.sh[[email protected] ~]# cat test.shecho $0[[email protected] ~]# sh test.shtest

shell指令碼關於getopts的使用方法

例子: while getopts ":e:s:pd:l" arg; do   case $arg in   e)        ghs_env=$OPTARG       ;;   s)  

Shell 指令碼的檔名匹配和命令執行

理解下 shell 指令碼中的檔名匹配和命令執行的順序與結果。我們學習這個的目的是可以熟悉的在 shell 指令碼中寫出快速的找到檔案的命令。它可以匹配檔名中的任何字串,匹配檔名中的單個字元以及匹配檔名中的字母或數字符號。         首先我們來看看匹配檔案的符號

Shell 指令碼執行mysql語句

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux/Unix shell 指令碼呼叫SQL RMAN指令碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

shell指令碼的函式與子shell

shell指令碼中的函式與子shell 原文https://www.jianshu.com/p/7db79d7997b5 函式 函式的使用 bash中也有函式。一個函式就是一個子程式,是用於實現一串操作的程式碼塊。bash中的函式的形式如下: functi

Shell指令碼併發執行緒以及併發數的控制

http://blog.chinaunix.net/uid-8478094-id-3995108.html Shell指令碼中併發執行緒以及併發數的控制 主要記錄一下Shell指令碼中的命令的併發和序列執行。 預設的情況下,Shell指令碼中的命令是序列執行的,必須等到前一條命令

shell指令碼向hive動態分割槽插入資料

  set hive.exec.dynamic.partition=true;                     #開啟動態分割槽,預設是falseset hive.exec.dyn

shell 指令碼獲取命令的輸出

這個主要介紹的方法是獲取命令的輸出內容,而不是命令執行成功與否的返回值。 通常情況下,在shell指令碼中需要獲取命令的輸出內容,然後根據輸出內容判斷下一步的執行操作。 比較常用的一種方式就是, 匹配命令輸出的內容中是否存在某些關鍵字,選擇執行的不同動作。 比較常用的一種方式就是

shell指令碼的讀檔案(while read line)與寫檔案(here document)

shell指令碼中如何讀取外部檔案並進行相關操作呢?正規化如下,是要背滴: while read line; do process $line done < file 如何在寫中將內容寫入新檔案呢,要用到here document,一種特殊的重定向技術,小范式如下,也

shell指令碼計算時間差

1. 獲取開始、結束時間(獲取當前時間) timer_start=`date "+%Y-%m-%d %H:%M:%S"` timer_end=`date "+%Y-%m-%d %H:%M:%S"` 2. 計算時間差 duration=`echo eval $(($(date

shell指令碼case select 的使用

#!/bin/bash # case echo "1.Install PHP" echo "2.Install Mysql" echo "3.Install Nginx" read -p "please input your digit:" digit case "$digit" in

shell指令碼字串比較和數字比較和檔案測試

(1) 字串比較: 作用:測試字串是否相等,長度是否為零,字串是否為NULL。 常用的字串比較符號如下。 =:比較兩個字串是否相同,相同則為“是”。 !=:比較兩個字串是否相同,不同則為“是”。 -n:比較字串的長度是否大於0,如果大於0則為“是”。 -z:比較字串的長度是否等於