2013-11-22 139 views
1

我很困惑当我尝试输出中的一些模式在shell.The代码*是:意外行为

#!/bin/bash 
for i in {1..10} 
do 
    tmpstr="" 
    for ((c=1;c<=i;c++)) 
    do 
      tmpstr=$tmpstr'*' 
    done 
    echo $tmpstr #add some string after tmpstr will work 
done 

输出显示我ls命令的结果,在每个是线意外。如果我在echo $tmpstr之后添加任何字符串,代码将正常工作。例如,echo $tmpstr" "。那么如何理解这一点?

回答

4

你的脚本生成tmpStr

* 
** 
*** 
etc. 

导致以下echo语句

echo * 
echo ** 
echo *** 
etc. 

外壳下面的解释*作为通配符,并通过列举中的所有文件扩展它当前目录。

请注意,如果你把引号将shell变量:

echo "$tmpstr" 

shell不会扩大通配符和输出

* 
** 
*** 
**** 
***** 
****** 
******* 
******** 
********* 
********** 
+0

我觉得这是一个point.But空间之后的字符串将使得通配符不工作仍然是一个谜。 – Young

+0

我不关注。你声明这个代码可以很好地处理echo $ tmpStr“”。正如你写的那样,没有通配符,只是一个空格。 – EJK

+0

我的意思是'echo $ tmpstr“”'在第一个循环内而不是内部循环。 – Young