2013-03-08 36 views
2
#!/bin/bash 

sudo -u rei_sh -H -s <<-EOM 

echo "hi" 

for i in $(find -name *.properties) 

do 

echo "ivalue is \$i" 

done 

exit 

EOM 

我正在使用上面的这段代码。sudo通过find命令在这里输出文件后循环输出

当我运行代码时只打印“hi”。

但如果我“在一个二为我”使用下面的被印刷

ivalue is one 
ivalue is two. 

为什么我不能遍历的输出找到了这里的文件里面的命令?

+0

请注意,<< <<与'<< - '在这里一样好,因为HEREDOC从来不会被人眼看到。 (因为没有缩进,所以它们完全相同)。 – 2013-03-08 10:51:46

回答

3

因为$(...)在...的sudo踢之前运行,你需要引用EOM

sudo -u rei_sh -H -s <<-'EOM' 
    echo "hi" 
    for i in $(find -name *.properties) 
    do 
     echo "ivalue is $i" 
    done 
EOM 

exit是多余的。使用EOM附近的引号,您也不需要在echo命令中转义$。您也可以在$(...)之前逃过$,以防止执行命令前的sudo shell。

+0

Hi @ Jonathan.i与'EOM'一起尝试过,仍有相同的结果。只需“打印”即可。请咨询。在发布这个问题之前,我尝试在$(...)之前转义$,这也没有用。 – Jacksonvj 2013-03-08 11:36:20

+0

哦,小提琴! 'find'命令应该是固定的。 '找。 -name'* .properties'''左右,但你应该从它收到错误信息,我想。 – 2013-03-08 15:40:02

0

进程替换&变量扩展发生在处理heredocs之前。

尝试转义$ signs & glob(*)。