写在前面

今天因为新增了一个同名的程序(参数不同)导致shell脚本在获取进程cpu使用率的时候报错了,这个报错我首先想到的是之前在传参的时候可能没写后面的参数导致的,结果看了一眼是有加参数的,那问题就在于没获取到这个参数。脚本中参数是用$1、$2、$3这样去依次赋值的,而我传进去的参数分了3个空格,最后两个也就是程序名和程序参数其实是想着当作一个入参来被接收的,但我脚本中的那种赋值手法肯定是不会成功的😂,然后就依稀想起了之前看别人脚本里写的shift命令,这个好像是可以处理这种情况,然后就有了这篇文章。

示例

举个🌰

一个脚本有4个入参,分别是1 2 3 4

如果直接使用$符号来对应参数的话,分别就是$1 $2 $3 $4,这种很好理解

再举个🌰

一个脚本有3个入参,分别是1 2 3 4(其中3 4需要看作一个参数)

这种情况下,之前直接用$加序号的就行不通了,$3只会代表3

Shift命令简析

shift命令:参数左移,每执行一次参数序列顺次左移一个位置,参数总数$#减1

作用:分别处理每个参数,移出去的参数不再可用

还是上面的例子,入参1 2 3 4,脚本test.sh内容如下

1
2
3
4
5
6
#!/bin/bash
echo "args num is: $#, include :$@, first arg:$1"
shift
echo "args num is: $#, include :$@, second arg:$1"
shift
echo "args num is: $#, include :$@, third arg:$1"

说明一下,脚本中$#指代的是参数总个数,$@指代的是所有参数。

执行sh test.sh 1 2 3 4,结果如下:

pFk6i60.png

由上图可知,每执行一次shift就丢弃位于首位的参数,然后整体参数向作移动1位,原来的第二位参数变成第一位,后面的依此类推。

理解了shift命令,那么如何解决第二例子中的问题呢。这里就需要用到shift$@,用$@来指代3 4。示例如下:

1
2
3
4
5
6
#!/bin/bash
echo "first arg:$1"
shift
echo "second arg:$1"
shift
echo "third arg:$@"

也可写作:

1
2
3
4
5
#!/bin/bash
echo "first arg:$1"
echo "second arg:$2"
shift 2
echo "third arg:$@"

其中shift 2表示参数整体向左移动两位,原处于第一和第二位的参数被丢弃,3此时作为第一位。

执行结果如下:

pFkcuVS.png


参考

shell获取所有参数