2009-07-13 79 views
1

我有一个bash脚本来源于另一个文件的内容。其他文件的内容是我想要执行的命令并比较返回值。有些命令有多个命令,用分号(;)或和号(& &)分隔,我似乎无法完成这项工作。在这方面努力,我创建了一些测试脚本,如下所示:BASH带多个命令和可重入的变量

test.conf是文件通过测试

实施例1(本作品)被采购,我的输出是差分2秒

test.conf

 
    CMD[1]="date" 

test.sh

 
    . test.conf 
    i=2 
    echo "$(${CMD[$i]})" 
    sleep 2 
    echo "$(${CMD[$i]})" 

例2(不工作) test.conf(如上相同的脚本)

 
    CMD[1]="date;date" 

实施例-3(试过,它不起作用或者) test.conf(同上脚本)

 
    CMD[1]="date && date" 

我不t希望我的变量CMD在tick标记内,因为这样,这些命令将在调用源代码时执行,我看不出重新评估该变量的方法。

这个剧本基本上是在通1调用CMD来检查一番,如果传递1,我得到一个错误的读数,我做了一些工作,在脚本来纠正的错误读取和重新执行&重新评估的输出CMD;通过-2。

这里是一个例子。在这里我正在检查SSHD是否在运行。如果我在通过1时评估CMD [1]时没有运行,我将启动它并重新评估CMD [1]。

test.conf

 
    CMD[1]=`pgrep -u root -d , sshd 1>/dev/null; echo $?` 

所以,如果我修改为我的测试脚本,然后test.conf变为: 注意:刻度线没有显示出来,但它是我的键盘下面的〜关口的关键。

 
    CMD[1]=`date;date` or `date && date` 

我的剧本是这样的(处理刻度线)

 
    . test.conf 
    i=2 
    echo "${CMD[$i]}" 
    sleep 2 
    echo "${CMD[$i]}" 

我得到尽管延迟2秒打印两次相同的日期/时间。因此,CMD没有得到重新评估。

+1

你的问题是不明确的 - 实际上,我没有看到这个问题。你究竟想要做什么,哪里出错?你的“示例”,“test.conf CMD [1] = pgrep -u”......使得宝贵的意义不大 - “源文件”在哪里?你如何解析参数 - 你看到引号时缺少引号? – 2009-07-13 18:28:33

+0

这是一个测试脚本,而不是实际的。因此,$ i的原因仍然存在(切除 - 过去),这是不明确的。其中x = 0 ... 10的CMD [x]是返回1或0的测试条件;主要是这个过程是否正在运行,与上面给出的pgrep例子类似。除了CMD,我还有一个相应的RESTART [x],在我调用它之后,我重新评估CMD [x]以查看进程是否重新启动。在其他示例中,我正在检查是否存在日志文件。我不想让这些细节讨论这个论坛,但它可能会有帮助。 谢谢! – Eric 2009-07-14 12:16:42

回答

1

首先,除非你需要与老贝兼容,你不应该使用反引号不支持$() - ,然后只有

其次,我不明白你为什么要设置CMD[1]但随后i集调用CMD[$i]2

无论如何,这是一个办法(和它类似于巴里的答案的一部分):

CMD[1]='$(date;date)' # no backticks (remember - they carry Lime disease) 
eval echo "${CMD[1]}" # or $i instead of 1 
1

从情侣你的问题的行,我本来期望一些这样的方法:

#!/bin/bash 

while read -r line; do 
    # munge $line 
    if eval "$line"; then 
     # success 
    else 
     # fail 
    fi 
done 

如果你有反引号源,你必须逃脱他们避免过早地进行评价, 。另外,反引号并不是评估代码的唯一方法 - 如上所示,有eval。也许这是你正在寻找的eval

例如,该行:

CMD[1]=`pgrep -u root -d , sshd 1>/dev/null; echo $?` 

是应当看起来可能是这样的:

CMD[1]='`pgrep -u root -d , sshd 1>/dev/null; echo $?`' 
+0

这个工程!然而,根据我和你以前的评论(我们同意),我不想在那里回复。这个脚本不能在Linux以外的任何其他环境中运行,我无法控制BASH并同意您的可移植性问题! – Eric 2009-07-14 12:19:26