【问题标题】:bash execute command in variablebash 在变量中执行命令
【发布时间】:2014-08-27 14:17:41
【问题描述】:

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

check_ifrunning=\`ps aux | grep "programmname" | grep -v "grep" | wc -l\`

该命令检查当前是否正在运行特定程序。 稍后在我的脚本中,我想查询某个点上变量的值。 如果特定程序正在运行,脚本应该休眠 15 分钟。

我是这样解决的:

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

脚本会在每次循环运行时执行变量中的命令,还是会在第一次执行后保留变量中的值?

我的脚本中有更多变量可以改变它们的值。这只是一个简单的例子。

【问题讨论】:

    标签: linux bash shell variables command


    【解决方案1】:

    注意check_ifrunning 只设置一次,在

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

    并且它设置在循环之前

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

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

    您可能只是想要(使用pidof(8))-没有定义或使用任何check_ifrunning Bash 变量

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

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

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

    考虑阅读Advanced Bash Scripting Guide...

    如果您正在编写 Bash 脚本,请考虑以

    开头
     #!/bin/bash -vx
    

    调试时。满意后,删除-vx...

    【讨论】:

    • 首先感谢您的回答。所以我必须在每次循环之前“重新设置”变量?这可以通过我在每个循环之前调用的函数来实现吗?如前所述,我的脚本中有更多类似的变量。它们可能会在脚本运行期间发生变化。
    • 阅读有关 bash 脚本的更多信息。使用-vx 技巧。您似乎对 bash 中的变量感到非常困惑......
    【解决方案2】:

    如果你想封装你的命令,正确的做法是使用函数。

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

    grep -q 你得到的结果是退出代码,而不是输出;你使用它就像

    if running "$programname"; then
        :
    

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 2021-07-12
      • 2020-07-01
      • 2012-10-30
      • 2023-04-07
      • 2011-10-16
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多