Linux命令学习之shift命令

Posted konglingbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令学习之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)
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 plain copy
 
  1. #!/bin/bash  
  2.   
  3. function func_t(){  
  4.         shift   #将函数func_1的位置参数向左移动一位  
  5.         echo [email protected]  
  6. }  
  7.   
  8. shift   #将脚本tmp.sh的位置参数向左移动一位  
  9. func_t ee rr ss  
  10.   
  11. echo [email protected]  

使用sh tmp.sh 11 22 33来调用脚本,执行结果如下:

 

[plain] view plain copy
 
  1. rr ss  
  2. 22 33  

在 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 installed(DNS设置)
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


















以上是关于Linux命令学习之shift命令的主要内容,如果未能解决你的问题,请参考以下文章

Linux命令学习之—每天发一个命令—mkdir

Python学习之Linux极简教程

Python学习之Linux极简教程

Python学习之Linux极简教程

Linux学习之CentOS--初识linux的一些常用命令

Linux学习之基础命令