需求是這樣的:那么今天閑著想把腳本弄得更自(無)動(腦)化(懶),shell腳本后帶參數(shù)執(zhí)行芥吟,其中參數(shù)的個數(shù)不確定(包含列表)迁酸,而現(xiàn)在腳本模塊需要獲取傳入的倒數(shù)第2個參數(shù)和除倒數(shù)第一個參數(shù)外的全部參數(shù)炸宵,不想用循環(huán)列出來券膀,想用類似python的切片方式君纫,所以今天就跟這有關(guān)系的awk、shell數(shù)組芹彬、字符輸出和特殊變量磕上了蓄髓。shell也能好好玩......
實例:/bin/bash script.sh "1001 1002 1003 1004 1005" 1 ?, 腳本里面要賦值給變量a=1005 , b="1001 1002 1003 1004"
#!/bin/bash
function A(){
? ? a=${!#}
? ? b=${@:1:$#-1}
}
A $1
? ? 這里"1001 1002 1003 1004 1005"會以列表形式傳入,用數(shù)組的方法行不通的舒帮,但是研究一下不難發(fā)現(xiàn)分片方法同樣適用会喝。${@:1:$#-1} 其中$@是列表形式列出所有的傳入?yún)?shù),然后:1是從第一個參數(shù)開始玩郊,后面不加任何東西的話是一直到結(jié)尾肢执,而加:$#-1是$#是參數(shù)總個數(shù)-1,即顯示除去最后一個參數(shù)外的所有參數(shù)瓦宜。
若要獲取倒數(shù)第二個參數(shù)即c=1004蔚万,可以這樣實現(xiàn):
c=${@:$#-1:1}
一開始模糊了shell的數(shù)組概念,想通過數(shù)組實現(xiàn)的临庇,所以也歸納一下數(shù)組反璃、變量字符輸出以及特殊字符用法:
首先要知道shell數(shù)組是以什么形式展現(xiàn)的~
數(shù)值類型的數(shù)組:一對括號表示數(shù)組,數(shù)組中元素之間使用“空格”來隔開假夺。
arr_num=(5 4 3 2 1)
字符串類型數(shù)組:同樣淮蜈,使用一對括號表示數(shù)組,其中數(shù)組中的元素使用雙引號或者單引號包含已卷,同樣使用“空格”來隔開梧田。
arr_str=('aaa' 'bbb' 'ccc')
數(shù)組操作:
先賦值一個數(shù)組 arr_num=(5 4 3 2 1)
獲取數(shù)組長度:len=${#arr_num[@]}
讀取第一個參數(shù):a=${arr_num[0]}
給第一個參數(shù)賦值(會覆蓋):arr_num[0]=1
echo ${arr_num[@]} ? >>> ? ? ?(1 4 3 2 1)
賦值給一個新參數(shù)會追加到數(shù)組后面:arr_num[10]=9 ? ? ? ? ? ? ? ? arr_num[8]=0
echo ${arr_num[@]}? >>>? ? ? (5 4 3 2 1 0 9)
刪除第一個參數(shù):unset arr_num[0]
分片(獲取第2到第4個參數(shù)):${arr_num[@]:1:3}
替換:${arr_num[@]/1/55}
echo ${arr_num[@]}? >>> ? ? ?(5 4 3 2 55)
shell的字符輸出
假設(shè)有變量 test=http://www.baidu.com/haha.html
注:(左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示)
1. # 號截取侧蘸,刪除左邊字符裁眯,保留右邊字符。
echo ${test#*//}
其中 test 是變量名讳癌,# 號是運算符穿稳,*// 表示從左邊開始刪除第一個 // 號及左邊的所有字符
結(jié)果:www.baidu.com/haha.html
2. ## 號截取,刪除左邊字符晌坤,保留右邊字符逢艘。
echo ${test##*/}
##*/ 表示從左邊開始刪除最后(最右邊)一個 / 號及左邊的所有字符
即刪除 http://www.baidu.com/
結(jié)果是 haha.html
3.從右邊第幾個字符開始,及字符的個數(shù)
echo ${test:0-9:4}
其中的 0-9 表示右邊算起第9個字符開始骤菠,4 表示字符的個數(shù)它改。
結(jié)果是:haha
4.右邊第幾個字符開始,一直到結(jié)束商乎。
echo ${test:0-9}
表示從右邊第9個字符開始央拖,一直到結(jié)束。
結(jié)果是:haha.html
5.%號截取鹉戚,刪除右邊字符爬泥,保留左邊字符
echo ${test%/*}
%/* 表示從右邊開始,刪除第一個 / 號及右邊的字符
結(jié)果是:http://www.baidu.com
6. %% 號截取崩瓤,刪除右邊字符袍啡,保留左邊字符
echo ${test%%/*}
%%/* 表示從右邊開始,刪除最后(最左邊)一個 / 號及右邊的字符
結(jié)果是:http:
shell的特殊字符
$# 是傳給腳本的參數(shù)個數(shù)
$0 是腳本本身的名字
$1 是傳遞給該shell腳本的第一個參數(shù)
$2 是傳遞給該shell腳本的第二個參數(shù)
$@ 是傳給腳本的所有參數(shù)的列表
$* 是以一個單字符串顯示所有向腳本傳遞的參數(shù)却桶,與位置變量不同境输,參數(shù)可超過9個
$$ 是腳本運行的當前進程ID號
$? 是顯示最后命令的退出狀態(tài),0表示沒有錯誤颖系,其他表示有錯誤
${!#}輸出最后一個參數(shù)