其实作为刚学shell的菜鸟,我不知道这个题目总结得对不对。但是就实践来说,的确是没有问题的。
我最近在写的一个脚本是在ClearCase的VOB里去查找一些element。如果要查找VOB里的文件,就需要有view。在脚本里,如果setview,就会fork一个子进程。为了避免这个,ClearCase提供了一个命令:cleartool setview -exec "command" [view_tag]。
我当时是要在上面的command里从一个文件读入element,然后执行相应的操作。一开始是这样写的
func1()
{
cleartool setview -exec "while read line;do cleartool desc -l $line;fi;done << $1" view_tag
}
func1 element_list
执行中发现,当调用func1的时候,$line并没有按照预想的取得element_list里相应的每一行的内容,而是空的。
修改之后,能正确执行的脚本如下:
func1()
{
cleartool setview -exec "while read line;do cleartool desc -l \$line;fi;done << $1" view_tag #就是在$line前加了一个转义的\
}
func1 element_list
究其原因,大概是因为shell是解释性的语言,它在执行语句前,会先把变量进行扩展。但是因为$line要在while循环中才能赋值,所以如果不转义$line,就只能得到一个空值。当转义之后,就是告诉shell,这个变量的值要到while循环才扩展。
暂时我还没有在ABS文档找到相应的解释。如果某天看到了,再来更新这里。
感谢Ace_fei和Chris_li两位大侠的指教。