Shell編程之特殊變量的筆記小結
$0 $# $n-->$[1..9] $* $@
1、在shell中存在著一些特殊而又重要的變如:$1 $0 $#,我們稱為特殊的位置變量要從命令行,函數,腳本,等傳遞參數時,就需要在shell腳本中使用位置參數變量
- $0:顯示當前的腳本文件名,如果在執(zhí)行腳本時添加了路徑,那么全部都會輸出
- $n:獲取當前執(zhí)行的shell腳本的第n個參數值比如:[n=1..9],如果N大于9那么就要使用{}來定義 比如${10}
- $#:獲取當前shell腳本后面接的參數的個數
- $*:獲取當前腳本的參數,不加引號和$@是一樣的 加了引號;例如"$*" 則表示單個字符串。相當于"$1 $2 $3"
- $@:同樣也是獲取當前shell的參數,不加引號和$*是一樣的,那么加了引號如:"$@" 表示將所有的參數視為不同獨立的字符串,相當于"$1" "$2"..
總結:$*和$@不加雙引號 是沒有任何區(qū)別的,有雙引號兩者就有區(qū)別
1)$1 $2 特殊變量實戰(zhàn)
[root@yankerp src]# cat test.sh #查看腳本的內容 #!/bin/bash echo $1 ---<定義了$1 [root@yankerp src]# source test.sh yankai #執(zhí)行的腳本的時候將yankai賦值給腳本中的1 yankai #輸出yankai [root@yankerp src]#
例2:
[root@yankerp src]# cat test.sh #腳本內容 #!/bin/bash echo $1 [root@yankerp src]# source test.sh zhangsan lisi #zhansgan lisi是兩個字符串以空格分割 zhangsan #只輸出了zhangsan,因為腳本中只定義了$1 [root@yankerp src]#
例3:
[root@yankerp src]# cat test.sh #查看腳本的內容 #!/bin/bash echo $1 [root@yankerp src]# source test.sh "zhangsan lisi" #加雙引號表示一個字符串參數 zhangsan lisi #最后輸出結果為zhangsan lisi [root@yankerp src]#
例4:在腳本中添加$1 $2測試:
[root@yankerp src]# cat test.sh #查看腳本的內容 #!/bin/bash echo $1 $2 定義了$1 $2 [root@yankerp src]# source test.sh zhangsan lisi #在執(zhí)行腳本的時候定義了兩個字符串 zhangsan lisi #說明 zhangsan賦值給了$1 lisi賦值給了$2 輸出結果為 zhangsan lisi [root@yankerp src]#
同時也可以這樣加雙引號 如下:
[root@yankerp src]# cat test.sh #查看腳本的內容 #!/bin/bash echo $1 $2 [root@yankerp src]# source test.sh "zhangsan lisi" yankai #""表示一個字符串 zhangsan lisi yankai #輸出結果 [root@yankerp src]#
2)當我們一個個的輸入echo $1---15時會感覺很慢我們可以使用以下命令來接收命令傳遞的15個參數
[root@yankerp src]# echo \${1..15} $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
將輸出的內容導入到test.sh文件中
[root@yankerp src]# echo \${1..15} > test.sh [root@yankerp src]# cat test.sh $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@yankerp src]#
我們在腳本第一行加入echo
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
3)打印26個字母如下:
[root@yankerp src]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z
傳入26個字母a-z 作為26個參數
[root@yankerp src]# cat test.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 #腳本內容 [root@yankerp src]# source test.sh {a..z} #傳入26個字母 a b c d e f g h i a0 a1 a2 a3 a4 a5 #位置參數大于9后,輸出的內容就不對了 [root@yankerp src]#
當位置參數大于9時 上面已經提到了我們可以使用{}來定義如下:
[root@yankerp src]# cat test.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
再次·執(zhí)行
[root@yankerp src]# source test.sh {a..z} a b c d e f g h i j k l m n o
4)$0特殊變量實戰(zhàn)
[root@yankerp src]# cat y.sh #!/bin/bash echo $0
當我們不帶路徑運行腳本,它會打印腳本的名稱,如下:
[root@yankerp src]# sh y.sh y.sh
當我們帶絕對路徑來執(zhí)行腳本時,它會輸出路徑+腳本名
[root@yankerp src]# sh /usr/local/src/y.sh /usr/local/src/y.sh
介紹dirname ---- basename
[root@yankerp src]# dirname /usr/local/src/y.sh /usr/local/src [root@yankerp src]# basename /usr/local/src/y.sh y.sh
·dirname功能:獲取腳本的路徑
·basename:獲取腳本的名稱
例如:
[root@yankerp src]# cat y.sh #!/bin/bash dirname $0 basename $0 [root@yankerp src]# sh /usr/local/src/y.sh /usr/local/src y.sh [root@yankerp src]#
5)$#特殊變量獲取傳參個數實踐
[root@yankerp src]# cat test.sh echo $1 $2 $3 $4 $5 $6 $7 $8 $9 < 9個位置參數變量 echo $# <----加入$# [root@yankerp src]# source test.sh {a..z} <傳入26個字符 a b c d e f g h i -----<只接收9個變量 26 ----<傳入26個字符。因此這里顯示26 [root@yankerp src]#
實例1:條件表達式判斷語句如下:
#!/bin/bash [ $# -ne "2" ] && { #如果用戶輸入的傳參個數不等于2 echo "請輸出正確的數值" #那么輸出此信息 exit 1 #隨后退出腳本 } echo "輸入正確" #如果輸入的傳參個數是2 那么就輸出此信息
運行腳本如下:
[root@yankerp src]# sh p.sh 請輸出正確的數值 [root@yankerp src]# sh p.sh zhangsan lisi 輸入正確 [root@yankerp src]#
IF語句判斷如下:
#!/bin/bash if [ $# -ne "2" ] -------如果輸入的傳參個數不是2 then ------那么 echo "/usr/local/src/ $0 請輸入正確的值" --輸出一個/usr/local---路徑加$0 $0表示輸出運行腳本的名稱 else echo "輸入正確" fi
執(zhí)行如下:
[root@yankerp src]# sh p.sh /usr/local/src/ p.sh 請輸入正確的值 [root@yankerp src]# sh p.sh zhangsan lisi 輸入正確 [root@yankerp src]#
$* $@后續(xù)再出?。?!
二、shell進程中特殊狀態(tài)變量
$? $$(不常用) $!(不常用) $_(不常用)$$ 和 $!都是獲取腳本進程號PID,但是有所不同這里不在演示
1、$?特殊變量實踐
[root@yankerp ~]# pwd /root [root@yankerp ~]# echo $? 0 [root@yankerp ~]
當我們執(zhí)行每一條命令結束后,echo $? 如果它輸出0那么就代表成功
[root@yankerp ~]# sfkljlfsdfsdf bash: sfkljlfsdfsdf: 未找到命令... [root@yankerp ~]# echo $? 127 [root@yankerp ~]#
非0則代表失敗。
案例:安裝Apache判斷是否安裝成功
[root@yankerp ~]#yum install httpd -y
案例2:通過腳本控制命令及腳本執(zhí)行返回值
#!/bin/bash if [ "$#" -ne "3" ] then echo "/bin/bash $0" 請輸出正確字符 exit 120 ---<如果以上不成立 并指定120值退出腳本 else echo "輸入正確" fi
運行如下:
[root@yankerp ~]# sh k.sh /bin/bash k.sh 請輸出正確字符 [root@yankerp ~]# echo $? 120 [root@yankerp ~]# [root@yankerp ~]# sh k.sh zhangsan lisi wangwu 輸入正確 [root@yankerp ~]# echo $? 0 [root@yankerp ~]#
聲明:以上文章是<<跟著老男孩學Linux運維Shell編程實戰(zhàn)>>第四章看完的總結;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
一鍵配置CentOS iptables防火墻的Shell腳本分享
這篇文章主要介紹了一鍵配置CentOS iptables防火墻Shell腳本分享,可保存到一個腳本文件中,在新安裝的CentOS系統(tǒng)時一條命令搞定iptables配置,需要的朋友可以參考下2014-07-07