shift妙用之解决shell编程中的入参问题
shell编程经常会遇到参数个数不定的这种情况,这种情况怎么处理呢?shift就要闪亮登场了。
$#是入参的个数,
$@是当前所有的入参
$0是脚本的名字
$1是第一个入参,$2是第二个入参。。。。
Bash定义了$1到$9,一共9个位置变量,这就决定了我们不能无限制的用$11之类的来获取更多的入参。
这时候就需要用shift了,shift会将入参右移,如下图所示:
我们看一段shell代码,加深理解:
root@manu:~/code/shell/temp# cat test.sh
#!/bin/sh
until [ $# -eq 0 ]
do
echo "$@"
shift
done
看下输出:
root@manu:~/code/shell/temp# ./test.sh 10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
7 6 5 4 3 2 1
6 5 4 3 2 1
5 4 3 2 1
4 3 2 1
3 2 1
2 1
1
现在,如果入?⒌母鍪?欢ǎ?颐侨绾未?砣氩文兀
until [ -z "$1" ] # Until all parameters used up
do
store_input $1
shift
done
上面这个伪码片段表明如何处理不定的入参,通过store_input,我们将每一个入参保存下来,然后,我们就可以处理了。
最后的最后,给出一个处理不定参数的例子:
manu@manu:~/code/shell/temp$ cat sum.sh
#!/bin/sh
sum=0
until [ -z $1 ]
do
sum=`echo $sum+$1 |bc`
shift
done
echo $sum
输出如下:
manu@manu:~/code/shell/temp$ ./sum.sh 1 2 3 4 5 6 7 8 9 10
55
参考文章:
http://www.gimoo.net/article/40259.htm
linux批量备份服务器配置文件和目录的脚本
功能:1.只在备份机执行,远程的服务器只需要允许备份机用root通过密钥登录;2.在备份机上配置需要备份哪些服务器,在NEED_BACKUP_SERVERS这个数组增减
Bash的For循环(根据每次递增的数)
用BashShell的for循环,每次递增数是500就行了。#!/bin/bash##每次递增的数ADD_NUM=500#递增1的话取消下行注释,并相应的注释另一句for的开头的#for((i=1;i=29500;i++
消耗CPU资源的shell脚本
#!/bin/sh#filenamekillcpu.shif[$#!=1];thenecho"USAGE:$0CPUs"exit1;fiforiin`seq$1`doecho-ne"i=0;whiletruedoi=i+1;done"|/bin/sh&pid_array[$i]=$!;doneforiin"${pid_array[@]}";doecho'kill'$i';';done使用