2017-07-03 53 views
0

嗨有可能在這裏執行從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 
+0

你在這裏有什麼要求?肯定有比你說的更好的方法來做到這一點。 – Inian

+0

@Inian事情是我有一個腳本保存在我的本地路徑,當執行將sudo不同的用戶和那裏,因爲你看我從這裏採取指令DOC我想要一個循環後sudo執行到另一個用戶,因爲如果執行外面它然後它適用於本地路徑不是sudo用戶。 –

回答

1

您需要使用單引號here document

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

否則外殼換人如$(…)在當前執行上下文而不是其他用戶。這與單個quoted字符串中的變量和其他外殼替換未如何擴展相似。

+0

你能解釋一下我們爲什麼需要使用'EOF'嗎?我的意思是爲什麼它在沒有它的當前shell中執行。 –

0

我認爲你需要在$(ls -r)的前面添加一個反斜槓以使你的代碼正常工作。即

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

這是因爲當你是這裏的文件(這兩個之間的EOF)的內部,所有的變量是局部的,你必須使用這些本地變量,是從shell變量分開。但令人困惑的是,如果你只是把$ variable放在heredoc中,它不會引用heredoc中定義的$變量,而是引用shell中定義的$變量。要訪問heredoc自己的局部變量,你必須避開$,即\ $變量。

我不確定'EOF'是否會工作,因爲'EOF'和EOF之間的所有內容都被解釋爲實際字符。