需求是這樣的:那么今天閑著想把腳本弄得更自(無)動(腦)化(懶),shell腳本后帶參數執行,其中參數的個數不確定(包含列表),而現在腳本模塊需要獲取傳入的倒數第2個參數和除倒數第一個參數外的全部參數,不想用循環列出來,想用類似python的切片方式,所以今天就跟這有關系的awk、shell數組、字符輸出和特殊變量磕上了。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"會以列表形式傳入,用數組的方法行不通的,但是研究一下不難發現分片方法同樣適用。${@:1:$#-1} 其中$@是列表形式列出所有的傳入參數,然后:1是從第一個參數開始,后面不加任何東西的話是一直到結尾,而加:$#-1是$#是參數總個數-1,即顯示除去最后一個參數外的所有參數。
若要獲取倒數第二個參數即c=1004,可以這樣實現:
c=${@:$#-1:1}
一開始模糊了shell的數組概念,想通過數組實現的,所以也歸納一下數組、變量字符輸出以及特殊字符用法:
首先要知道shell數組是以什么形式展現的~
數值類型的數組:一對括號表示數組,數組中元素之間使用“空格”來隔開。
arr_num=(5 4 3 2 1)
字符串類型數組:同樣,使用一對括號表示數組,其中數組中的元素使用雙引號或者單引號包含,同樣使用“空格”來隔開。
arr_str=('aaa' 'bbb' 'ccc')
數組操作:
先賦值一個數組 arr_num=(5 4 3 2 1)
獲取數組長度:len=${#arr_num[@]}
讀取第一個參數:a=${arr_num[0]}
給第一個參數賦值(會覆蓋):arr_num[0]=1
echo ${arr_num[@]} ? >>> ? ? ?(1 4 3 2 1)
賦值給一個新參數會追加到數組后面:arr_num[10]=9 ? ? ? ? ? ? ? ? arr_num[8]=0
echo ${arr_num[@]}? >>>? ? ? (5 4 3 2 1 0 9)
刪除第一個參數:unset arr_num[0]
分片(獲取第2到第4個參數):${arr_num[@]:1:3}
替換:${arr_num[@]/1/55}
echo ${arr_num[@]}? >>> ? ? ?(5 4 3 2 55)
shell的字符輸出
假設有變量 test=http://www.baidu.com/haha.html
注:(左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示)
1. # 號截取,刪除左邊字符,保留右邊字符。
echo ${test#*//}
其中 test 是變量名,# 號是運算符,*// 表示從左邊開始刪除第一個 // 號及左邊的所有字符
結果:www.baidu.com/haha.html
2. ## 號截取,刪除左邊字符,保留右邊字符。
echo ${test##*/}
##*/ 表示從左邊開始刪除最后(最右邊)一個 / 號及左邊的所有字符
即刪除 http://www.baidu.com/
結果是 haha.html
3.從右邊第幾個字符開始,及字符的個數
echo ${test:0-9:4}
其中的 0-9 表示右邊算起第9個字符開始,4 表示字符的個數。
結果是:haha
4.右邊第幾個字符開始,一直到結束。
echo ${test:0-9}
表示從右邊第9個字符開始,一直到結束。
結果是:haha.html
5.%號截取,刪除右邊字符,保留左邊字符
echo ${test%/*}
%/* 表示從右邊開始,刪除第一個 / 號及右邊的字符
6. %% 號截取,刪除右邊字符,保留左邊字符
echo ${test%%/*}
%%/* 表示從右邊開始,刪除最后(最左邊)一個 / 號及右邊的字符
結果是:http:
shell的特殊字符
$# 是傳給腳本的參數個數
$0 是腳本本身的名字
$1 是傳遞給該shell腳本的第一個參數
$2 是傳遞給該shell腳本的第二個參數
$@ 是傳給腳本的所有參數的列表
$* 是以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個
$$ 是腳本運行的當前進程ID號
$? 是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤
${!#}輸出最后一個參數