位置參數是標準的數字:$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
$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
在shell腳本中使用命令參數時,若執行腳本時,沒有帶參數,執行會報錯spa
所以在寫腳本時應先測試參數是否存在,能夠用 if 語句測試,例如 if [ -n $1 ] 命令行
而後再對參數進行處理,若檢測到沒有參數,則給出提示。code
$#— —含有腳本運行時命令行參數的個數 注:${$#}不能反回最後一個參數值,應改成${!#}對象
#!/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
$* 和$@提供了對全部命令行參數的訪問遞歸
$* 將命令行上全部參數當成一個參數ip
$@以空格爲分隔符,單獨處理每個參數get
shift命令能夠移動變量,將每個參數變量減一,因此變量$3的值會移到$2,變量$2的值會移到$1,變量$1的值會刪除。(變量$0不會改變)
shift n 實現多位移動,shift 2移動2位
應用:在不知道命令行有多少參數時,能夠只操做第一個參數,移動參數,而後繼續操做第一個參數,知道檢測到第一個參數長度爲0,以實現對全部參數的操做。
注:shift使用要當心,當參數被移除後,被丟掉沒法恢復。
選項(options):跟在單破折線後的單個字母,能改變命令的行爲
使用case語句檢查每一個選項,是否是有效選項。
#!/bin/bash #處理選項 while [ -n "$1" ] do case "$1" in -a)command;; -b)command;; -c)command;; -d)command;; ... *)command;; esac shift done
選項和參數同時存在時,使用雙破直線(--)將兩者分開,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
有些選項會帶有額外的參數值,當命令行選項帶有額外參數時,腳本正確檢測和處理.
以下:-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
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'
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
命令格式: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
在建立shell腳本時,儘可能保持選項與Linux通用的選項含義相同,Linux通用選項有:
-a 顯示全部對象 -c 生產一個計數 -d 指定一個目錄 -e 擴展一個對象 -f指定讀入數據的文件 -h顯示命令的幫助信息 -i 忽略文本大小寫 -l 產生輸出得長格式文本 -n 使用非交互模式 -o 指定將全部輸出重定向到輸出文件 -q 以安靜模式運行 -r 遞歸的處理目錄和文件 -s 以安靜模式運行 -v 生成詳細輸出 -x 排除某個對象 -y 對全部問題回答yes
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
-t:使用read命令時,會一直等用戶輸入,能夠用-t選項來制定計時器,當計時器過時後,read命令會返回一個非零退出狀態碼。
read -t 5 -p "Please enter your name: " name #會等5s,能夠改變數字以改變等的時間
-n和數字:對輸入的字符計數,當輸入的字符達到預設的字符數時,它會自動退出,將輸入的數據賦給變量。
read -n1 -p "Please enter your name: " name #只接受一個字符,空格也是字符。
-s 阻止用戶的輸入顯示在顯示器上,(實際上,數據會被顯示,只是read命令將文本顏色設置成跟背景顏色同樣)
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"