在執行一個腳本程序時,會常常須要向腳本傳遞一些參數,並根據輸入的參數值生成相應的數據或執行特定的邏輯。編程
執行Shell腳本時能夠帶有參數,在Shell腳本中有變量與之對應進行引用。這類變量的名稱很特別,分別是0、一、二、3...被稱爲位置變量。bash
位置變量是由 0 開始,其中 0 變量預留用來保存實際腳本的名字,1 變量對應腳本程序的第 1個參數,依次類推。與其餘變量同樣,能夠在Shell 中經過「$」符號來引用位置變量的值。ssh
[root@localhost 20190105]# vi paral.sh #!/bin/bash #顯示腳本名 echo 'The script name is '$0 #顯示第1個參數 echo 'The 1th parameter is '$1 #顯示第2個參數 echo 'The 2th parameter is '$2 #顯示第3個參數 echo 'The 3th parameter is '$3 #顯示第4個參數 echo 'The 4th parameter is '$4 #顯示第5個參數 echo 'The 5th parameter is '$5 #顯示第6個參數 echo 'The 6th parameter is '$6 #顯示第7個參數 echo 'The 7th parameter is '$7 #顯示第8個參數 echo 'The 8th parameter is '$8 #顯示第9個參數 echo 'The 9th parameter is '$9 [root@localhost 20190105]# ./paral.sh Ni hao , Nice to meet you ! The script name is ./paral.sh The 1th parameter is Ni The 2th parameter is hao The 3th parameter is , The 4th parameter is Nice The 5th parameter is to The 6th parameter is meet The 7th parameter is you The 8th parameter is ! The 9th parameter is //空值 [root@localhost 20190105]#
使用 read 命令能夠從鍵盤上讀取數據,而後賦給指定的變量,在Shell腳本中實現與用戶的數據交互。spa
read命令的格式code
read 變量1 [變量2...]
read命令能夠從鍵盤上讀取到多個變量的值,用戶輸入數據時,數據間以空格或者 Tab鍵做爲分隔。blog
若是變量個數與輸入的數據個數相同,則依次對應賦值;進程
若是變量個數大於輸入的數據個數,則從左到右對應賦值;若是沒有數據,則以之對應的變量爲空;ip
若是變量個數少於輸入的數據個數,則從左到右對應賦值,最後一個變量被賦予剩餘的全部數據。input
經過 read 命令讀取鍵盤上輸入的數據保存到變量中,同時把變量值顯示在屏幕上,當用戶輸入 exit 時結束程序。it
[root@localhost 20190105]# vi read1.sh #!/bin/bash #初始化變量的值 input1='' #設置 input1 變量值爲空 input2='' #設置 input2 變量值爲空 input3='' #設置 input3 變量值爲空 input4='' #設置 input4 變量值爲空 #until 循環,當 input1 變量的值爲 exit 時退出該循環 until [ "$input1" = exit ] do echo 'Please input the values:' #讀取鍵盤輸入的數據 read input1 input2 input3 input4 #輸入的不是 exit 時把用戶輸入的數據顯示在屏幕上 if [ "$input1" != exit ] then echo 'input1: '$input1 #輸出變量 input1 的值 echo 'input2: '$input2 #輸出變量 input2 的值 echo 'input3: '$input3 #輸出變量 input3 的值 echo 'input4: '$input4 #輸出變量 input4 的值 echo #當輸入爲 exit 時顯示退出腳本的提示 else echo 'Exit the script.' fi done [root@localhost 20190105]# chmod +x read1.sh [root@localhost 20190105]# ./read1.sh Please input the values: How do you do //輸入的數據個數與變量個數相等 input1: How input2: do input3: you input4: do Please input the values: Welcome to beijing //輸入的數據個數小於變量個數 input1: Welcome input2: to input3: beijing input4: Please input the values: let's go //輸入的數據個數小於變量個數 input1: let's input2: go input3: input4: Please input the values: Nice to meet you,too! //輸入的數據個數大於變量個數 input1: Nice input2: to input3: meet input4: you,too! Please input the values: //結束程序 exit Exit the script. [root@localhost 20190105]#
運行結果能夠看出:
特殊變量及說明 | |
變量名 | 說明 |
$# | 傳遞給腳本的參數個數 |
$* | 傳遞給腳本的全部參數的值 |
$@ | 與$*相同 |
$$ | 腳本執行所對應的進程號 |
$! | 後臺運行的最後一個進程的進程號 |
$- | 顯示Shell使用的當前選項 |
$? | 顯示命令的退出狀態,0:正確,1:錯誤。 |
[root@localhost 20190105]# vi vall.sh #!/bin/bash echo 'The value of $# is: '$# //輸出$#變量的值 echo 'The value of $* is: '$* //輸出$*變量的值 echo 'The value of $@ is: '$@ //輸出$@變量的值 echo 'The value of $$ is: '$$ //輸出$$變量的值 echo 'The value of $! is: '$! //輸出$!變量的值 echo 'The value of $- is: '$- //輸出$-變量的值 echo 'The value of $? is: '$? //輸出$?變量的值 [root@localhost 20190105]# ./vall.sh how do you do The value of $# is: 4 //輸出4變量的值 The value of $* is: how do you do //輸出how do you do變量的值 The value of $@ is: how do you do //輸出how do you do變量的值 The value of $$ is: 9040 //輸出9040變量的值 The value of $! is: //輸出變量的值 The value of $- is: hB //輸出hB變量的值 The value of $? is: 0 //輸出0變量的值 [root@localhost 20190105]#
如何屏蔽命令的輸出結果
Linux 默認會建立一個設備文件/dev/null(空設備),全部輸出到該設備的信息都會被屏蔽。經過把命令的輸出重定向到設備/dev/null,能夠屏蔽命令的輸出結果。
命令 > /dev/null
屏蔽命令的錯誤輸出
命令 2> /dev/null
屏蔽命令的正常以及錯誤輸出
命令 > /dev/null 2> /dev/null
例如:要在 Shell 代碼中使用 grep 命令查找文件是否存在某個關鍵字,可是又但願屏幕 grep 命令的輸出。
if grep jack /etc/passwd > /dev/null then echo "jack found" fi
若是 /etc/passwd 文件中有 jack 關鍵字的信息,將會顯示 jack found,但不會輸出 grep 命令的執行結果。
如何把一條命令分紅多行編寫
Linux 的 Shell 腳本功能很是強大,它容許用戶經過管道方式把多個命令組合在一塊兒,但所以每每也致使在一行 Shell 腳本代碼中編寫的命令過長,難以閱讀,爲了使腳本的結構更加清晰,能夠把一行 Shell 腳本代碼分紅多行進行編寫。
使用兩個管道符把ps、grep 和 awk 命令組合。
[root@localhost ~]# ps -ef | grep sshd | awk '{print $2}' 4478 12821 22028
在一行代碼中把多個命令組合在一塊兒,難以閱讀。Shell 提供了一個特殊字符「\」,能夠把一行代碼分紅多行進行編寫。
[root@localhost ~]# ps -ef | \ > grep ssh | \ > awk '{print $2}' 4478 12821 23375 [root@localhost ~]#