shift:位置参数,shift默认是shift 1
Bash 定义了9个位置变量,从 $1 到 $9,这并不意味着用户在命令行只能使用9个参数,借助 shift 命令可以访问多于9个的参数。Shift 命令一次移动参数的个数由其所带的参数指定。例如当 shell 程序处理完前九个命令行参数后,可以使用 shift 9 命令把 $10 移到 $1。
shift介绍:http://www.jb51.net/article/40260.htm
eval:重新运算求出参数的内容,eval可读取一连串的参数,然后再依参数本身的特性来执行,参数不限数目,彼此之间用分号分开
shift和eval处理的速度差别不大。
https://www.cnblogs.com/f-ck-need-u/p/7426371.html
http://blog.51cto.com/363918/1341977
http://blog.csdn.net/damotiansheng/article/details/39735441
$#:传入参数的总个数
$@ $*:当前所有的传入参数:
$@ :原样保存了参数列表
$*:保存了以$IFS指定的分割符所分割的字符串组
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。 但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
例子:第一个参数为主机名,其余参数为docker容器ip ,查询物理机上所有docker容器的信息,如输入 sh qcid.sh 520 10.xx 10.33.xx ...
#!/bin/bash qcid -h xxx-docker$1.bj |cut -d, -f1 >c$1 if [ -f "c$1" ];then echo -e "c$1已创建!" cat c$1; else exit fi echo qcid -h xxx-docker$1.bj|cut -d, -f2 > tmp && qcron -f tmp |grep has echo if [ $# -ge 2 ];then shift; for i in "$@";do ./qtree $i | xargs echo "$i " done # for (( i=2; i<=$#; i++ ));do # eval j=\$i # ./qtree $j | xargs echo "$j " # done else echo "no container" fi