bash在变量中执行命令

时间:2014-07-07 07:10:20

标签: linux bash shell variables command

我在bash的变量中有一个命令:

check_ifrunning =`ps aux | grep“programmname”| grep -v“grep”| wc -l`

如果特定程序正在运行,该命令将检查。 稍后在我的脚本中,我想查询一个点上变量的值。 如果特定程序正在运行,则脚本应该休眠15分钟。 我这样解决了:

而[$ check_ifrunning -eq 1];做什么 睡300儿 DONE

现在我的问题是:
脚本是否会在每个循环运行的变量中执行命令,还是第一次执行后变量中的值会保留? 我的脚本中有更多变量可以改变它们的值,这只是一个简单的例子。

提前感谢您的帮助。

最好的问候。

2 个答案:

答案 0 :(得分:1)

请注意,check_ifrunning仅在

中设置一次
 check_ifrunning=`ps aux | grep "programmname" | grep -v "grep" | wc -l` 

并且在循环之前设置

 while [ $check_ifrunning -eq 1 ]; do
   sleep 300
 done 

出于调试目的,您可以在echo check_ifrunning is $check_ifrunning之前的while循环内添加sleep语句...

你可能只想要(使用pidof(8)) - ,不用定义或使用任何check_ifrunning bash 变量

 while [ -n "$(pidof programname)" ]; do
    sleep 300
 done

因为您想测试每次循环开始时programname是否正在运行!

您应该使用更可嵌套且更具可读性的$( ... )而不是反引号。

考虑阅读Advanced Bash Scripting Guide ....

如果您正在编写bash脚本,请考虑使用

启动它
 #!/bin/bash -vx
调试时

如果您满意,请删除-vx ....

答案 1 :(得分:1)

如果要封装命令,正确的方法是使用函数。

running () {
    ps aux | grep "$1" | grep -q -v grep
}

使用grep -q,您将获得结果作为退出代码,而不是输出;你就像

一样使用它
if running "$programname"; then
    :

理想情况下,第二个grep是不必要的,但我不想过多地使代码复杂化。如果您正在寻找grep,它仍然无法正常工作。正确的解决方案是pidof

另见http://mywiki.wooledge.org/BashFAQ/050