第十一课 $* 和 $@ 的区别
(1)$*将所有的命令行所有参数视为单个字符串,等同于”$1$2$3”
(2)$@将命令行每个参数视为单独的字符串,等同于”$1”/”$2”/”$3”。这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。
示例:
#set -- “I am” handsome oldboy.
#echo $#
3
#for i in $*;do echo $i;done #==>循环打印这些参数,用$*,无引号
I
am
handsome
oldboy.
#for i in $@;do echo $i;done #==>在没有引号的情况下,这里的结果$*和$@是一样的
I
am
handsome
oldboy.
#for i;do echo $i;done #==>去掉in变量列表,相当于in “$@”
I am
handsome
oldboy.
#for i in “$@”;do echo $i;done #==>在有双引号的情况下,参数里引号内内容当做一个参数输出了,这才真正符合我们传入的参数需求,set -- “I am” handsome oldboy.
I am
handsome
oldboy.
#for I in “$*”;do echo $i;done #==>加了双引号,$*表示一个字符串
I am handsome oldboy.
#shift #==>用shift去掉第一个参数
#echo $#
2
#for i in “$@”;do echo $i;done #==>再次打印只剩后面两个参数了
handsome
oldboy.
# for i in “$*”;do echo $i;done
handsome oldboy.
#for i;do ehco $i;done
handsome
oldboy.
Set和eval的使用案例
http://oldboy.blog.51cto.com/2561410/1175971
第十二课 bash内部变量
有些内部命令在目录列表时是看不见的,它们由shell本身提供,常用的内部命令:
echo,eval,exec,export,readonly,read,shift,wait,exit和点(.)
echo变量名表
将变量名表指定的变量显示到标准输出。
evalargs
读入参数args,并将它们组合成一个新的命令,然后执行。
exec
当shell执行到exec语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的shell)就终止了,所以shell程序中exec后面的语句将不再被执行。
export 变量名=value
shell可以用export把它的变量向下带入子shell,从而让子进程继承父进程中的环境变量。但子shell不能用export把它的变量向上带入父shell。
readonly 变量名
从标准输入读字符串,传给指定变量
可以在函数中用local变量名的方式申明局部变量
shift 语句
shift语句按如下方式重新命名所有的位置参数变量,即$2成为 $1,$3 成为$2…在程序中每使用一次shift语句,都使所有的位置参数一次向左移动一个位置,并使位置参数$#减1,直到减到0为止。