从此处执行循环指令DOC

时间:2017-07-03 10:53:23

标签: bash shell unix

您好可以在UNIX中从此处执行DOC循环。我试过自己,但它没有工作有没有办法呢?

#!/bin/bash
path=/global/u70/glob
echo abcd | sudo -S -l
sudo /usr/bin/su - glob  << EOF

for entry in $(ls -r)
  do
  echo "$entry"
  done
EOF

也尝试过功能 - :

 #!/bin/bash
    path=/global/u70/glob
    echo abcd | sudo -S -l
    sudo /usr/bin/su - glob  << EOF
    run(){
    for entry in $(ls -r)
      do
      echo "$entry"
      done
}
run
    EOF

2 个答案:

答案 0 :(得分:1)

您需要使用单引号 here document

sudo /usr/bin/su - glob  << 'EOF'
[…]
EOF

否则,$(…)等shell替换将在当前上下文中执行,而不是作为其他用户执行。这类似于单个quoted字符串中的变量和其他shell替换未扩展的方式。

答案 1 :(得分:0)

我认为您需要在$(ls -r)前添加反斜杠才能使代码生效。即。

sudo /usr/bin/su - glob  << EOF
for entry in \$(ls -r)
  do
  echo "$entry"
  done
EOF

这是因为当你在这里的文档中(在两个EOF之间)时,所有变量都是本地的,你必须使用这些与shell变量分开的局部变量。但令人困惑的部分是,如果你只是将$变量放在heredoc中,它就不会引用heredoc中定义的$变量,而是引用shell中定义的$ variable。要访问heredoc自己的局部变量,您必须转义$,即\ $变量。

我不确定'EOF'是否有效,因为'EOF'和EOF之间的所有内容都被解释为实际字符。