我有一个 bash 脚本,它从另一个文件中获取内容。另一个文件的内容是我想要执行并比较返回值的命令。有些命令有多个命令,用分号(;)或与号(&&)分隔,我似乎无法完成这项工作。为了解决这个问题,我创建了一些测试脚本,如下所示:
test.conf 是测试所获取的文件
示例 1(可行),我的输出相差 2 秒
测试.conf
CMD[1]="date"
测试.sh
. test.conf i=2 echo "$(${CMD[$i]})" sleep 2 echo "$(${CMD[$i]})"
示例 2(这不起作用) test.conf(与上面相同的脚本)
CMD[1]="date;date"
Example-3(尝试过这个,它也不起作用) test.conf(与上面相同的脚本)
CMD[1]="date && date"
我不希望我的变量 CMD 位于刻度线内,因为这样,命令将在调用源时执行,并且我看不到重新评估变量的方法。
该脚本本质上是在 pass-1 上调用 CMD 来检查某些内容,如果在 pass-1 上我得到错误读数,我会在脚本中做一些工作来纠正错误读数并重新执行和重新评估输出指令;通过-2。
这是一个例子。我在这里检查 SSHD 是否正在运行。如果当我在 pass-1 上评估 CMD[1] 时它没有运行,我将启动它并再次重新评估 CMD[1]。
测试.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 不会被重新评估。
最佳答案
首先,您永远不应该使用反引号,除非您需要与不支持 $()
的旧 shell 兼容 - 并且只有这样。
其次,我不明白为什么您要设置 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
关于具有多个命令和可重入的 BASH 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1121189/