shell 獲取倒數第二個參數

需求是這樣的:那么今天閑著想把腳本弄得更自(無)動(腦)化(懶),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%/*}

%/* 表示從右邊開始,刪除第一個 / 號及右邊的字符

結果是:http://www.baidu.com

6. %% 號截取,刪除右邊字符,保留左邊字符

echo ${test%%/*}

%%/* 表示從右邊開始,刪除最后(最左邊)一個 / 號及右邊的字符

結果是:http:


shell的特殊字符

$# 是傳給腳本的參數個數

$0 是腳本本身的名字

$1 是傳遞給該shell腳本的第一個參數

$2 是傳遞給該shell腳本的第二個參數

$@ 是傳給腳本的所有參數的列表

$* 是以一個單字符串顯示所有向腳本傳遞的參數,與位置變量不同,參數可超過9個

$$ 是腳本運行的當前進程ID號

$? 是顯示最后命令的退出狀態,0表示沒有錯誤,其他表示有錯誤

${!#}輸出最后一個參數

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,782評論 0 11
  • Shell腳本語言學習一Shell腳本語言學習三 Shell腳本語言 echo命令? 顯示普通字符串腳本代碼: ...
    SimpleBK閱讀 449評論 0 1
  • 0.linux啟動的步驟 設備加電----》BIOS自檢-----》grub引導啟動-----》加載內核----》...
    萌面大叔2閱讀 796評論 0 1
  • 基礎 頭文件 #!/bin/bash 或者#!/bin/sh #!約定的標記,如IOS的Import 執行文件時需...
    ZMJun閱讀 1,252評論 1 2
  • 基礎命令 主要的命令和快捷鍵 Linux系統命令由三部分組成:cmd + [options]+[operation...
    485b1aca799e閱讀 1,126評論 0 0