2015-12-02 241 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."