Shell編程中Shift的用法小結(jié)
位置參數(shù)可以用shift命令左移。比如shift 3表示原來(lái)的$4現(xiàn)在變成$1,原來(lái)的$5現(xiàn)在變成$2等等,原來(lái)的$1、$2、$3丟棄,$0不移動(dòng)。不帶參數(shù)的shift命令相當(dāng)于shift 1。
非常有用的 Unix 命令:shift。我們知道,對(duì)于位置變量或命令行參數(shù),其個(gè)數(shù)必須是確定的,或者當(dāng) Shell 程序不知道其個(gè)數(shù)時(shí),可以把所有參數(shù)一起賦值給變量$*。若用戶(hù)要求 Shell 在不知道位置變量個(gè)數(shù)的情況下,還能逐個(gè)的把參數(shù)一一處理,也就是在 $1 后為 $2,在 $2 后面為 $3 等。在 shift 命令執(zhí)行前變量 $1 的值在 shift 命令執(zhí)行后就不可用了。
示例如下:
#測(cè)試 shift 命令(x_shift.sh) until [ $# -eq 0 ] do echo "第一個(gè)參數(shù)為: $1 參數(shù)個(gè)數(shù)為: $#" shift done 執(zhí)行以上程序x_shift.sh: $./x_shift.sh 1 2 3 4
結(jié)果顯示如下:
第一個(gè)參數(shù)為: 1 參數(shù)個(gè)數(shù)為: 4
第一個(gè)參數(shù)為: 2 參數(shù)個(gè)數(shù)為: 3
第一個(gè)參數(shù)為: 3 參數(shù)個(gè)數(shù)為: 2
第一個(gè)參數(shù)為: 4 參數(shù)個(gè)數(shù)為: 1
從上可知 shift 命令每執(zhí)行一次,變量的個(gè)數(shù)($#)減一,而變量值提前一位,下面代碼用 until 和 shift 命令計(jì)算所有命令行參數(shù)的和。
#shift 上檔命令的應(yīng)用(x_shift2.sh) if [ $# -eq 0 ] then echo "Usage:x_shift2.sh 參數(shù)" exit 1 fi sum=0 until [ $# -eq 0 ] do sum=`expr $sum + $1` shift done echo "sum is: $sum"
執(zhí)行上述程序:
$x_shift2.sh 10 20 15
其顯示結(jié)果為:
45
Shift 命令還有另外一個(gè)重要用途, Bsh 定義了9個(gè)位置變量,從 $1 到 $9,這并不意味著用戶(hù)在命令行只能使用9個(gè)參數(shù),借助 shift 命令可以訪問(wèn)多于9個(gè)的參數(shù)。
Shift 命令一次移動(dòng)參數(shù)的個(gè)數(shù)由其所帶的參數(shù)指定。例如當(dāng) shell 程序處理完前九個(gè)命令行參數(shù)后,可以使用 shift 9 命令把 $10 移到 $1。
擴(kuò)展:Shell grep 命令擴(kuò)展增強(qiáng)
背景: 線上排查問(wèn)題需要找出有某個(gè)特征的日志,并獲取這些日志的完整調(diào)用日志鏈路。
比如, 通過(guò)某個(gè)tag 獲取到了這些日志的 請(qǐng)求id 【Span ID】,
cat xxxx.log | grep '某tag' | awk -F '某tag' '{print $2}'
然后還需要再一步取得所有SpanId的完整日志鏈。顯然目前我們需要使用 xargs 來(lái)批處理執(zhí)行。 但這里有個(gè)問(wèn)題。 grep 無(wú)法支持這種用法。
如下:
[localhost ~]$ cat xxxxxx.log | grep '某tag' | awk -F '某tag' '{print $2}' | xargs grep xxxxxx.log grep: 某SpanId: No such file or directory
grep 第一個(gè)參數(shù)必須是 關(guān)鍵詞正則 ,其后跟隨文件路徑。
所以為了解決這個(gè)問(wèn)題,我們需要使用一個(gè)改造后的SHELL腳本,這里命名為 grepx ,用于增強(qiáng) grep 命令:
#!/bin/bash FILE_PATH="$1*" COUNT=0 while [ $# -gt 0 ] do if [ $COUNT -gt 0 ] then grep "$1" $FILE_PATH #輸出空白行用來(lái)隔斷日志 echo -e "\n\n" fi #shift命令用于對(duì)參數(shù)的移動(dòng)(左移),通常用于在不知道傳入?yún)?shù)個(gè)數(shù)的情況下,依次遍歷每個(gè)參數(shù) shift let COUNT=COUNT+1 done
原理是對(duì)調(diào)參數(shù)位置, 再通過(guò) shift 命令移動(dòng)參數(shù),批量讀取管道傳遞過(guò)來(lái)的參數(shù),或者 控制臺(tái)傳遞的參數(shù)。
然后 shell 腳本便可以寫(xiě)成如下:
cat xxxxxx.log | grep '某tag' | awk -F '某tag' '{print $2}' | xargs ~/grepx xxxxxx.log
到此這篇關(guān)于Shell編程中Shift的用法小結(jié)的文章就介紹到這了,更多相關(guān)Shell編程中Shift用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell腳本通過(guò)參數(shù)名傳遞參數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Shell腳本通過(guò)參數(shù)名傳遞參數(shù)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Shell腳本編寫(xiě)Nagios插件監(jiān)控程序資源占用
這篇文章主要介紹了Shell腳本編寫(xiě)Nagios插件監(jiān)控程序資源占用,本文先是給出了需求和需求分析,然后給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-12-12Shell腳本變量的只讀?刪除?類(lèi)型及注釋語(yǔ)法基礎(chǔ)
這篇文章主要介紹了Shell腳本變量的只讀刪除類(lèi)型及注釋語(yǔ)法基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05rm -rf之后磁盤(pán)空間沒(méi)有釋放的解決方法
本文主要介紹了rm -rf之后磁盤(pán)空間沒(méi)有釋放的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Linux下is not in the sudoers file的解決
當(dāng)我們使用sudo命令切換用戶(hù)的時(shí)候可能會(huì)遇到提示以下錯(cuò)誤:用戶(hù)名 is not in the sudoers file.本文給大家分享原因分析及解決方案,感興趣的朋友跟隨小編一起看看吧2023-02-02Shell中調(diào)用、引用、包含另一個(gè)腳本文件的三種方法
這篇文章主要介紹了Shell中調(diào)用、引用、包含另一個(gè)腳本文件的三種方法,需要的朋友可以參考下2014-04-04Shell中case...in分支語(yǔ)句的應(yīng)用
shell作為一種腳本編程語(yǔ)言,同樣包含循環(huán)、分支等其他程序控制結(jié)構(gòu),從而輕松完成更加復(fù)雜、強(qiáng)大的功能,本文主要介紹了Shell中case...in分支語(yǔ)句的應(yīng)用,感興趣的可以了解一下2023-08-08shell寫(xiě)的告警次數(shù)控制及恢復(fù)示例代碼
自己寫(xiě)的一個(gè)監(jiān)控腳本,發(fā)現(xiàn)告警短信次數(shù)未控制時(shí),垃圾短信N多。經(jīng)過(guò)思考,做了個(gè)簡(jiǎn)單的控制,同一故障只發(fā)送二次。之后不再發(fā)送?;謴?fù)后發(fā)送恢復(fù)短信2013-02-02