1. 程式人生 > 實用技巧 >Linux命令學習之shift命令

Linux命令學習之shift命令

轉載自https://www.cnblogs.com/klb561/p/9080106.html

位置引數可以用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)
1 until [ $# -eq 0 ]
2 do
3 echo "第一個引數為: $1 引數個數為: $#"
4 shift
5 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)
 1 if [ $# -eq 0 ]
 2 then
 3 echo "Usage:x_shift2.sh 引數"
 4 exit 1
 5 fi
 6 sum=0
 7 until [ $# -eq 0 ]
 8 do
 9 sum=`expr $sum + $1`
10 shift
11 done
12 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。

1.shell指令碼中的位置引數

shell指令碼中的位置引數有兩種:

一種是呼叫指令碼時傳給指令碼的引數,另一種是呼叫指令碼的函式時,傳給函式的引數。

2.shift

shift可以用來向左移動位置引數。

使用方法:

shift num 將位置引數向左移動num個位置,預設情況下num為1.

舉例說明:

[plain]view plaincopy
  1. #!/bin/bash
  2. functionfunc_t(){
  3. shift#將函式func_1的位置引數向左移動一位
  4. echo$@
  5. }
  6. shift#將指令碼tmp.sh的位置引數向左移動一位
  7. func_teerrss
  8. echo$@

使用sh tmp.sh 11 22 33來呼叫指令碼,執行結果如下:

[plain]view plaincopy
  1. rrss
  2. 2233

在 Linux 下如果想修改網絡卡的引數有很多種方法,第一種方法是修改 /etc/network/interfaces 檔案,這種方法可以在重啟後依然有效;另外一種方法是使用 ifconfig 指令,這種方法只能臨時性的修改網絡卡引數,在重啟後會失效。

第一種:修改 interfaces 檔案

interfaces 檔案在 /etc/network/ 資料夾下,是網路介面配置檔案,裡面包含了所有網路介面的配置資訊。

interfaces 檔案有自己的編寫規則,其中以 '#' 開頭的行會被系統忽略,因此可以作為註釋使用。每個指令佔一行,如果寫不下可以用 '' 符號作為此行結尾,在下一行接著寫命令。

檔案由 "iface","mapping","auto","allow-" 和 "source" 欄位組成。下面是一個例子:

auto lo eth0
allow-hotplug eth1

iface lo inet loopback

source interfaces.d/machine-dependent

mapping eth0
    script /usr/local/sbin/map-scheme
    map HOME eth0-home
    map WORK eht0-work

iface eth0-home inet static
    address 192.168.1.1
    netmask 255.255.255.0
    up flush-mail

iface eth0-work inet dhcp

iface eth1 inet dhcp

以 "auto" 開頭的行是用來確定物理網路介面將會被啟動當ifup -a指令被執行時(這個指令會在系統啟動指令碼中使用,因此開機時會自動啟動以 "auto" 開頭設定的網絡卡)。在 "auto" 欄位的後面應該緊跟著物理介面的名字,interfaces 檔案中可以設定多個 "auto" 方式啟動的網路介面,ifup指令會按照順序啟動網路裝置。

以 "allow-" 開頭的行是用來確定通過哪種子系統來啟動那些應該被自動啟動的網路裝置。這樣就可以使用指令ifup --allow=hotplug來啟動那些已經設定 "allow-hotplug" 的網路裝置。

NOTE:"allow-auto" 和 "auto" 是同義詞。

以 "source" 開頭的行是用來包含其他檔案的欄位,因此可以把配置拆成幾個檔案。 "source" 後面接的是檔案路徑, shell 下面的萬用字元可以使用。

以 "mapping" 開頭的行是用來給將要啟動的物理裝置介面確定邏輯介面名。"mapping" 欄位的第一行是以 "mapping" 開始的,後面跟著 shell 下 glob 指令語法相同的模式匹配(如 eth*)。每個 "mapping" 欄位必須包含一個指令碼定義,這個指令碼使用物理裝置介面名作為引數,並且會把下面所有以 "map" 開頭的欄位(不包括 "map" 本身)提供給它作為輸入。在指令碼執行結束前會輸出一段字串,具體例子可以參考 /usr/share/doc/ifupdown/examples 下面的例子檔案。

對映一個包含搜尋對映匹配模式的名字並且執行使用第一個匹配的欄位來執行指令碼,指令碼輸出的名字就是原來網絡卡將要被對映的名字。

如:

通過PING配置網路

Linux 在處理 PCMCIA 卡的時候有比較好的方式,可以在 PCMICA 卡插入時通過一個配置指令碼來確定網路地址。但是,筆記本上的網絡卡是筆記本自帶的,並非 PCMCIA 卡,由於經常需要奔波於辦公室、實驗室和家之間,就經常需要修改網路地址。如果我去的每一個地方都安裝了 DHCP ,那麼我就可以把 eth0 設定成為 DHCP 的方式,然而我的情況卻是:在家可以使用DHCP,在辦公室和實驗室都要使用固定地址。

為了解決這個問題,我們可以使用一種 mapping 機制,這種方法的基本原理是通過執行一個程式來確定目前所處的環境,併為這個環境選擇一套配置。我現在使用的就是通過ping一個網路的閘道器來確定當前網絡卡究竟連線在哪個網路上,然後再選擇這個網路的配置。

首先,在 /usr/share/doc/ifupdown/examples 中有一個檔案 ping-places.sh ,把它複製到 /etc/network 目錄中,然後chmod a+x /etc/network/ping-places.sh。下面就是編輯 /etc/network/interfaces 檔案,下面是一個例子:

mapping eth0 ①
script /etc/network/ping-places.sh
map 192.168.0.107/24 192.168.0.1 home
map 10.1.133.165/24 10.1.133.1 office
map 10.1.0.107/24 10.1.0.1 lab
iface home inet dhcp ②
iface office inet static ③
address 10.1.133.165
netmask 255.255.255.0
gateway 10.1.133.1
up cp /etc/resolv.conf.school /etc/resolv.conf ④
iface lab inet static
address 10.1.0.107
netmask 255.255.255.0
gateway 10.1.0.1
up cp /etc/resolv.conf.school /etc/resolv.conf
  1. 表示對於網路裝置呼叫指令碼 /etc/network/ping-places.sh ,如果能夠用地址 192.168.0.107/24
    ping 通地址 192.168.0.1 ,則將 eth0 對映為裝置 home ,即啟動 home 的配置。後面的 office 和 lab 與其類似。
  2. 表示虛擬裝置 home 使用 DHCP 分配的地址。
  3. 表示虛擬裝置 office 使用固定地址。
  4. 表示在啟動這個網路裝置後還要執行 cp 命令,從而指定一個域名解析方法。除了 up 以外,還有 pre-up、down 和 post-down 可以用來指定在啟動或停止網路裝置前後執行的命令。

NOTE:/usr/share/doc/ifupdown/examples中有一些配置網路的例子和需要的指令碼。

ifup通常會給一個物理介面名作為它的第一個沒有選項的引數。ifup同時也會使用這個名字作為介面的初始化邏輯名,除非它被指定了一個 "=LOGICAL" 格式的字尾,這樣ifup會使用 "LOGICAL" 作為介面的初始化邏輯名。

網絡卡配置例項

迴環引數配置

#
# The loopback network interface(配置環回口)
# 開機自動激lo介面
auto lo
# 配置lo介面為環回口
iface lo inet loopback

DHCP方式配置

#
# The primary network interface (配置主網路介面)
# 開機自動啟用eth0介面
auto eth0
# 配置eth0介面為DHCP自動獲取
iface eth0 inet dhcp

靜態 IP 地址分配

#
# The primary network interface (配置主網路介面)
#開機自動啟用eth0介面
auto eth0
#配置eth0介面為靜態設定IP地址
iface eth0 inet static
address 10.16.3.99
netmask 255.255.255.0
network 10.16.3.0
broadcast 10.16.3.255
gateway 10.16.3.1
# dns-* options are implemented by the resolvconf package, if installedDNS設定)
dns-nameservers 61.153.177.196 61.153.177.197
dns-search fireteam.org

無線網絡卡配置

auto wlan0
iface wlan1 inet static
    wpa-ssid wifi-name
    wpa-psk wifi-passwork
    address 192.168.1.200
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 202.196.64.1