shell script 交互式腳本,能夠讀取命令行參數、選項,用戶輸入數據

1.命令行參數

1.1通常參數

1.1.1讀取參數

位置參數是標準的數字:$0是程序名$1~$9是9個參數,若是腳本須要多於9個參數,須要在變量數字周圍加花括號,好比${10}、${11}、、、、能夠實現向腳本添加任意多要用的命令行參數。shell

#!/bin/bash
total1=$[ $1 * $2 ]
total2=$[ ${11} * ${12} ]
echo The tenth number is ${10}
echo The eleventh number is ${11}
echo The twelfth number is ${12}
echo The total1 is $total1
echo The total2 is $total2


執行./shell1.sh 1 2 3 4 5 6 7 8 9 10 11 12

The tenth number is 10
The tenth number is 11
The tenth number is 12
The total1 is 2
The total2 is 132
1.1.2讀取程序名$0

$0參數獲取shell在命令行啓動的程序的名字。basename命令能夠獲取腳本名字bash

能夠編寫一些基於所用腳本名而執行不一樣功能的腳本測試

#!/bin/bash
echo The command entered is:$0
執行結果:會帶有路徑,將第一個參數直接輸出
caishu@lab403-1F:~$ /home/caishu/shell_script/shell1.sh
The command entered is: /home/caishu/shell_script/shell1.sh

caishu@lab403-1F:~/shell_script$ ./shell1.sh
The command entered is: ./shell1.sh

改善:basename命令會只返回腳本名字
#!/bin/bash
name=`basename $0`
echo The command entered is:$bansename

執行結果:輸出腳本名字
caishu@lab403-1F:~$ /home/caishu/shell_script/shell1.sh
The command entered is: shell1.sh

caishu@lab403-1F:~/shell_script$ ./shell1.sh
The command entered is: shell1.sh
1.1.3測試參數 if [ -n $1 ]

在shell腳本中使用命令參數時,若執行腳本時,沒有帶參數,執行會報錯spa

所以在寫腳本時應先測試參數是否存在,能夠用 if 語句測試,例如 if [ -n $1 ] 命令行

而後再對參數進行處理,若檢測到沒有參數,則給出提示。code

1.2.特殊參數變量  $#、$* 和$@

1.2.1參數計數$#

$#— —含有腳本運行時命令行參數的個數  注:${$#}不能反回最後一個參數值,應改成${!#}對象

#!/bin/bash
#catch the last parameter
parameter=$#
echo the last parameter is $parameter
echo the last parameter is ${!#}
echo the last parameter is ${$#}

執行結果:
當有參數時,parameter和${!#}返回值同樣
caishu@lab403-1F:~/shell_script$ ./shell2.sh 1 2 3 4 5
the last parameter is 5
the last parameter is 5
the last parameter is 27804
當無參數時$parameter返回0,而${!#}返回$0參數所指——腳本名
caishu@lab403-1F:~/shell_script$ ./shell2.sh
the last parameter is 0
the last parameter is ./shell2.sh
the last parameter is 27803
1.2.2抓取全部數據$*和$@

$* 和$@提供了對全部命令行參數的訪問遞歸

$* 將命令行上全部參數當成一個參數ip

$@以空格爲分隔符,單獨處理每個參數get

1.3移動變量shift

shift命令能夠移動變量,將每個參數變量減一,因此變量$3的值會移到$2,變量$2的值會移到$1,變量$1的值會刪除。(變量$0不會改變)

shift n  實現多位移動,shift 2移動2位

應用:在不知道命令行有多少參數時,能夠只操做第一個參數,移動參數,而後繼續操做第一個參數,知道檢測到第一個參數長度爲0,以實現對全部參數的操做。

注:shift使用要當心,當參數被移除後,被丟掉沒法恢復。

2.處理選項

選項(options):跟在單破折線後的單個字母,能改變命令的行爲

2.1查找選項

2.1.1處理簡單選項

使用case語句檢查每一個選項,是否是有效選項。

#!/bin/bash
#處理選項
while [ -n "$1" ]
do
  case "$1" in
  -a)command;;
  -b)command;;
  -c)command;;
  -d)command;;
   ...
  *)command;;
  esac
  shift
done
2.1.2分離參數和選項

選項和參數同時存在時,使用雙破直線(--)將兩者分開,shell會用(--)來代表選項結束

#!/bin/bash
#處理選項和參數
while [ -n "$1" ]
do
  case "$1" in
  -a)command;;
  -b)command;;
  -c)command;;
  -d)command;;
   ...
  *)command;;
  esac
  shift
done

for  parameter in $@
do
  command
done

執行時選項和參數要用--分開,如:./test -a -b -c -- parameter1 parameter2 parameter3
2.1.3處理帶值的選項

有些選項會帶有額外的參數值,當命令行選項帶有額外參數時,腳本正確檢測和處理.

以下:-b選項有額外參數,因爲要處理的選項爲$1,所以額外的參數就應該位於$2位置,所以設置shift命令移動2次

#!/bin/bash
#處理帶參數的選項
while [ -n "$1" ]
do
  case "$1" in
  -a)command;;
  -b)parameter=$2 
     command
     shift;;
  -c)command;;
    ...
  --)shift
     break;;
  *)command;;
  esac
  shift
done

for  parameter in $@
do
  command
done

2.2使用getopt命令

2.2.1命令格式

getopt命令能夠接受一系列任意形式的命令行選項和參數,並自動將它們轉換成適當的格式。

getopt  optstring  options parameters

optstring 定義了選項有效字母,還定義了哪些選項須要參數(加:);若是指定了一個不在optstring中的選項,getopt命令會產生一條錯誤消息,若想忽略錯誤,則在getopt後加-q:

$ getopt ab:cd -a parameter1 -b parameter2 -cde parameter3
getopt 無效選項 --e
-a -b parameter2 -c -d -- parameter1  parameter3
$ getopt -q ab:cd -a parameter1 -b parameter2 -cde parameter3
-a -b 'parameter2' -c -d -- 'parameter1' 'parameter3'
2.2.2在腳本中使用getopt

set --命令的帶雙破折線選項,它會將命令行參數替換成set命令的命令行的值。在腳本中使用方法:

set -- `getopt -q ab:c "$@"`  #注意反引號


#!/bin/bash
#使用getopt
set -- `getopt -q ab:c "$@"` 

while [ -n "$1" ]
do
  case "$1" in
  -a)command;;
  -b)parameter=$2 
     command
     shift;;
  -c)command;;
    ...
  --)shift
     break;;
  *)command;;
  esac
  shift
done

for  parameter in $@
do
  command
done

 2.3使用高級的getopts命令

命令格式:getopts optstring variable                                                                                          optstring與以前相同,忽略錯誤信息不是-q,而是:optstring    getopts命令將當前參數保存在variable中。

getopts命令用到兩個環境變量:OPTARG和OPTIND                                                    OPTARG保存了選項須要跟的參數值;OPTIND 保存了正在處理的參數位置

#!/bin/bash
#使用getopts

while getopts :ab:c opt
do
  case "$opt" in
  a)command;;
  b)  with value $OPTARG
     command
     shift;;
  c)command;;
    ...
  *)command;;
  esac
done

注:getopts命令解析命令行選項時,移除開頭的單破折線-(腳本中a b c前面都沒有-)

執行腳本時字母和選項能夠放在一塊兒不用加空格:./test -abparameter -c  (-c 前必須空格,不然沒法識別-c選項,會被當成-b參數的一部分)

getopts命令知道什麼時候中止處理選項,並將參數留給你處理。在getopts處理每一個選項時,OPTIND環境變量的值增一,處理完選項後,加一句shift $[ $OPTIND -1 ] 做爲處理參數的開始

#!/bin/bash
#使用getopts

while getopts :ab:c opt
do
  case "$opt" in
  a)command;;
  b)  with value $OPTARG
     command
     shift;;
  c)command;;
    ...
  *)command;;
  esac
done

shift $[ $OPTIND -1 ]

for para in "$@"
do
  command
done

2.4將選項標準化

在建立shell腳本時,儘可能保持選項與Linux通用的選項含義相同,Linux通用選項有:

-a 顯示全部對象    -c 生產一個計數    -d 指定一個目錄    -e 擴展一個對象    -f指定讀入數據的文件    -h顯示命令的幫助信息    -i 忽略文本大小寫   -l 產生輸出得長格式文本    -n 使用非交互模式    -o 指定將全部輸出重定向到輸出文件    -q 以安靜模式運行    -r 遞歸的處理目錄和文件    -s 以安靜模式運行    -v  生成詳細輸出   -x 排除某個對象   -y 對全部問題回答yes

3.得到用戶輸入read

3.1基本讀入

read接受用戶從鍵盤的輸入:

#!/bin/bash
echo -n "Enter your name:"       #-n選項移調末尾換行符,不換行
read name
echo "Hello $name"

輸出結果
Enter your name: caishu
Hello caishu

read的-p選項,直接置頂參數:

read -p "Enter your name:" name 
echo "Hello $name"

read命令會爲每一個提示符分配變量,若提示符用完了,則將剩下的全部變量,分配給最後一個提示符。

若在read命中不指定變量,read命令會將它收到的任何數據都放進特殊環境變量REPLY中,

$read -p "Enter your para:" para1 para2 para3; echo "your parameter is $para1,$para2,$para3..."
Enter your para:1 2 3 4 5 6 7
your parameter is 1,2,34567...

$read -p "Enter your para:" ; echo "your parameter is $REPLY"
Enter your para:caishu
your parameter is caishu

3.2超時

-t:使用read命令時,會一直等用戶輸入,能夠用-t選項來制定計時器,當計時器過時後,read命令會返回一個非零退出狀態碼。

read -t 5 -p "Please enter your name: " name   #會等5s,能夠改變數字以改變等的時間

-n和數字:對輸入的字符計數,當輸入的字符達到預設的字符數時,它會自動退出,將輸入的數據賦給變量。

read -n1 -p "Please enter your name: " name       #只接受一個字符,空格也是字符。

3.3隱藏方式讀取

-s 阻止用戶的輸入顯示在顯示器上,(實際上,數據會被顯示,只是read命令將文本顏色設置成跟背景顏色同樣)

3.4從文件中讀取

read line 會從文本中讀取一行,用cat命令的輸出經過管道傳給含有read的while命令

#!/bin/bash
#read data from a file

count=1
cat filename | while read line
do 
  echo "Line $count: $line
  count=$[ $count + 1 ]
done
echo "Finished processing the file"
相關文章
相關標籤/搜索