2015-12-02 150 views
0

我已經繼承了一個shell腳本,它執行一個帶有變量的命令。 我加入了更多細節,對不起,我是不是在早期的細節清楚,我不是外殼腳本shell腳本傳遞星號

#!/bin/sh 
ExecuteCommand() { 
    Command=`echo -e ${2}` 
    Comment=${4} 
    echo "INFO: ${Comment}" 
    echo "# ${Comment}" >> ${CommandsLog} 
    echo "${Command}" | paste -s -d' ' | tee -a ${CommandsLog} 
    echo "" | tee -a ${CommandsLog} 
    eval ${Command} | grep -v "ERROR : bad number of fields" 
    ExitCode=$? 
    if [ "${ExitCode}" != "0" ] && [ "${ExitCode}" != "" ] 
    then 
     exit ${ExitCode} 
    fi 
} 

set Option = echo ` '.*(def).*'` 
echo $Option 
ExecuteCommand -command "abc ${Option}" 

非常熟悉望着正在執行的命令日誌是沒有「*」; 即

.*(def).* 
abc '. (def). ' 

由於命令缺少「」,則命令失敗 我曾試圖通過在「$選項」可變但到失敗。 如何將''傳遞給命令。

+2

你的問題不明確。 shebang線是好的。下一行似乎執行一個名爲'ExecuteCommand'的命令,其中一個選項是'-command',另一個是擴展''abc $ {Option}「''的結果,但腳本中沒有任何設置'$ { Option}',因此它可以是空的或者是一個環境變量 - 但是你沒有告訴我們關於環境變量的內容。第三行代碼選擇在'$ {Option}'中運行任何命令的名稱 - 或者,如果$ {Option}中沒有任何內容,它將運行命令'is'而不是 - 帶有一些參數。這是怎麼回事? –

+0

現在,如果「腳本的第三行」真的在運行,那麼「環境變量'Option'設置爲''。*(def)。*''',那麼我們就進入了一個不同的球類遊戲可能是蟋蟀而不是棒球)但是,關於如何將信息傳遞到日誌文件還有很多未知的知識,也就是說,你如何得到星星的空白並不明顯,一般來說,引用星星可以防止它們被擴展 –

+1

在上述正確提到的所有不確定性的情況下,唯一的建議是在你的命令中包含'$ {Option}'的單引號(例如''abc'$ {Option}'「'。我不能保證將解決這個問題,但它是在可能的範圍內。 –

回答

0

看起來原來的作者並不是很熟悉shell腳本。

我不知道你要在這裏究竟做了什麼,但這裏是我的什麼,我相信解釋應該是怎麼回事(?):

#!/bin/sh 

LOGFILE=~/mylog 
PS4="Command: -> " ## You can set this you don't like the default "+". 

dowithlog(){ 
    (set -x; $1) 2>>"$LOGFILE" 
    echo "Comment: $2" >> "$LOGFILE" 
} 

dowithlog "ls /tmp" "Ok, cool beans."