Linux shell指令碼中shift的用法說明

2021-09-24 17:56:42 字數 1240 閱讀 6040

原文: 

shift命令用於對引數的移動(左移),通常用於在不知道傳入引數個數的情況下依次遍歷每個引數然後進行相應處理(常見於linux中各種程式的啟動指令碼)。

示例1:依次讀取輸入的引數並列印引數個數:

run.sh:

#!/bin/bash

while [ $# != 0 ];do

echo "第乙個引數為:$1,引數個數為:$#"

shift

done

輸入如下命令執行:run.sh a b c d e f

結果顯示如下:

第乙個引數為:a,引數個數為:6

第乙個引數為:b,引數個數為:5

第乙個引數為:c,引數個數為:4

第乙個引數為:d,引數個數為:3

第乙個引數為:e,引數個數為:2

第乙個引數為:f,引數個數為:1

從上可知 shift(shift 1) 命令每執行一次,變數的個數($#)減一(之前的$1變數被銷毀,之後的$2就變成了$1),而變數值提前一位。

同理,shift n後,前n位引數都會被銷毀,比如:

輸入5個引數: abcd e

那麼$1=a,$2=b,$3=c,$4=d,$5=e,執行shift 3操作後,前3個引數a、b、c被銷毀,就剩下了2個引數:d,e(這時d=$1,e=$2,其中d由$4—>$1,e由$5—>$2),參考示例如下:

示例2:

#!/bin/bash

echo "引數個數為:$#,其中:"

for i in $(seq 1 $#)

doeval j=\$$i

echo "第$i個引數($"$i"):$j"

done

shift 3

echo "執行shift 3操作後:"

echo "引數個數為:$#,其中:"

for i in $(seq 1 $#)

do#通過eval把i變數的值($i)作為變數j的名字

eval j=\$$i

echo "第$i個引數($"$i"):$j"

done

輸出結果為:

引數個數為:5,其中:

第1個引數($1):a

第2個引數($2):b

第3個引數($3):c

第4個引數($4):d

第5個引數($5):e

執行shift 3操作後:

引數個數為:2,其中:

第1個引數($1):d

第2個引數($2):e

Linux SHELL中sh和bash的區別

什麼是shell?shell的中文意思就是貝殼,其實比較類似於我們核心的殼。簡而言之就是只要能夠操作應用程式的介面都能夠稱為shell。狹義的shell指的是命令列方面的軟體,廣義的shell則包括圖形介面。shell的版本 在鳥哥的私房菜的一書中,介紹了unix的版本以及眾多的shell版本。早在...

Linux shell指令碼(編輯中)

shell是乙個程式,是使用者和linux核心溝通的橋梁 bin bash 其中 不是注釋,而是告訴作業系統將執行此指令碼所用的直譯器的名字。syntax on set hlsearch set tabstop 4 set autoindent 可以去掉冒號,新增到 vimrc中 bin bash ...

sh 指令碼語法

介紹 1 開頭 程式必須以下面的行開始 必須方在檔案的第一行 bin sh 符號 用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使用 bin sh來執行程式。當編寫指令碼完成時,如果要執行該指令碼,還必須使其可執行。要使編寫指令碼可執行 編譯 chmod x filename 這樣...