Shell編程中Shift的用法小結
位置參數可以用shift命令左移。比如shift 3表示原來的$4現在變成$1,原來的$5現在變成$2等等,原來的$1、$2、$3丟棄,$0不移動。不帶參數的shift命令相當於shift 1。
非常有用的 Unix 命令:shift。我們知道,對於位置變量或命令行參數,其個數必須是確定的,或者當 Shell 程序不知道其個數時,可以把所有參數一起賦值給變量$*。若用戶要求 Shell 在不知道位置變量個數的情況下,還能逐個的把參數一一處理,也就是在 $1 後為 $2,在 $2 後面為 $3 等。在 shift 命令執行前變量 $1 的值在 shift 命令執行後就不可用瞭。
示例如下:
#測試 shift 命令(x_shift.sh) until [ $# -eq 0 ] do echo "第一個參數為: $1 參數個數為: $#" shift done 執行以上程序x_shift.sh: $./x_shift.sh 1 2 3 4
結果顯示如下:
第一個參數為: 1 參數個數為: 4
第一個參數為: 2 參數個數為: 3
第一個參數為: 3 參數個數為: 2
第一個參數為: 4 參數個數為: 1
從上可知 shift 命令每執行一次,變量的個數($#)減一,而變量值提前一位,下面代碼用 until 和 shift 命令計算所有命令行參數的和。
#shift 上檔命令的應用(x_shift2.sh) if [ $# -eq 0 ] then echo "Usage:x_shift2.sh 參數" exit 1 fi sum=0 until [ $# -eq 0 ] do sum=`expr $sum + $1` shift done echo "sum is: $sum"
執行上述程序:
$x_shift2.sh 10 20 15
其顯示結果為:
45
Shift 命令還有另外一個重要用途, Bsh 定義瞭9個位置變量,從 $1 到 $9,這並不意味著用戶在命令行隻能使用9個參數,借助 shift 命令可以訪問多於9個的參數。
Shift 命令一次移動參數的個數由其所帶的參數指定。例如當 shell 程序處理完前九個命令行參數後,可以使用 shift 9 命令把 $10 移到 $1。
擴展:Shell grep 命令擴展增強
背景: 線上排查問題需要找出有某個特征的日志,並獲取這些日志的完整調用日志鏈路。
比如, 通過某個tag 獲取到瞭這些日志的 請求id 【Span ID】,
cat xxxx.log | grep '某tag' | awk -F '某tag' '{print $2}'
然後還需要再一步取得所有SpanId的完整日志鏈。顯然目前我們需要使用 xargs 來批處理執行。 但這裡有個問題。 grep 無法支持這種用法。
如下:
[localhost ~]$ cat xxxxxx.log | grep '某tag' | awk -F '某tag' '{print $2}' | xargs grep xxxxxx.log grep: 某SpanId: No such file or directory
grep 第一個參數必須是 關鍵詞正則 ,其後跟隨文件路徑。
所以為瞭解決這個問題,我們需要使用一個改造後的SHELL腳本,這裡命名為 grepx ,用於增強 grep 命令:
#!/bin/bash FILE_PATH="$1*" COUNT=0 while [ $# -gt 0 ] do if [ $COUNT -gt 0 ] then grep "$1" $FILE_PATH #輸出空白行用來隔斷日志 echo -e "\n\n" fi #shift命令用於對參數的移動(左移),通常用於在不知道傳入參數個數的情況下,依次遍歷每個參數 shift let COUNT=COUNT+1 done
原理是對調參數位置, 再通過 shift 命令移動參數,批量讀取管道傳遞過來的參數,或者 控制臺傳遞的參數。
然後 shell 腳本便可以寫成如下:
cat xxxxxx.log | grep '某tag' | awk -F '某tag' '{print $2}' | xargs ~/grepx xxxxxx.log
到此這篇關於Shell編程中Shift的用法小結的文章就介紹到這瞭,更多相關Shell編程中Shift用法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!