【问题标题】:Bash command substitution with a variable用变量替换 Bash 命令
【发布时间】:2011-02-08 16:50:49
【问题描述】:

我是 bash 脚本的新手,我一直在学习我正在进行的一个小项目。但是,我遇到了一个似乎无法解决的问题。

我有一个变量需要包含在命令中。当直接在 shell 中运行时(手动输入变量),该命令返回预期的结果。但是,在使用变量时我无法让它工作。

所以,如果我手动运行它,它会正确返回 0 或 1,具体取决于它是否正在运行。

ps -ef | grep -v grep | grep -c ProcessName

但是,当我尝试将它嵌入到这个 while 子句中时,它总是评估为 0,因为它没有搜索正确的文本。

while [ `ps -ef | grep -v grep | grep -c {$1}` -ne 0 ]
do
  sleep 5
done

有没有办法可以做到这一点?我尝试了无数种不同的方法都无济于事。我也尝试使用 $() 语法进行命令替换,但我也没有运气。

谢谢!

【问题讨论】:

  • 为什么你的while循环的测试中有大括号,但你的例子中没有? $1 的值是否正确?
  • 我将大括号放在 while 循环中,因为我认为我需要它们来表示变量。这可能是不正确的,但删除它们并不能解决我的问题。是的,$1 具有正确的值。我在while语句之前添加了echo $1,它是正确的。
  • 如果您需要使用花括号,美元符号放在开头的前面,并且引用它也是一个好主意:"${1}"。请参阅Process Management 了解一些有用的信息。
  • 您可能还想查看parameter expansion section of the bash man page。结果是$var${var}一样;后者适用于${var}_suffix 之类的情况,因为$var_suffix 将被解释为${var_suffix}。正如丹尼斯所说,$ 永远是第一位的。

标签: linux bash variables


【解决方案1】:

我认为你的意思不是{$1},而是"$1"。此外,您可以只使用pgrep -c "$1" 而不是两个管道。

此外,也无需比较grep -c0 的输出,因为您可以查看命令是否失败。因此,一个非常简化的版本可能是:

while pgrep "$1" > /dev/null
do
    sleep 4
done

【讨论】:

  • 我用"$1" 替换了{$1},但这也不起作用。我要检查一下,以确保我没有遗漏任何东西......
  • @grt3kl:对不起,我明白你在做什么错了——我现在意识到你是在某个进程正在运行时试图睡觉,而不是在它开始之前睡觉.因此,我将示例从 until pgrep "$1" 更改为 while pgrep "$1",这对我来说当然适用。
  • 您能解释一下pgrep "$1" > /dev/null 的作用吗?其实,除了算术比较,我都理解。如果我想做相反的事情(即在某个进程未运行时休眠),它会只是 pgrep "$1" <= /dev/null 还是完全不同的东西?
  • > 这里不是比较 - 它说将命令的标准输出重定向到特殊文件/dev/null,这基本上意味着将其丢弃。我添加了这一点,否则你会在 pgrep 命令运行时看到它的输出。
  • 我发现我的问题比我想象的要复杂一些,但是这个答案让我找到了解决方案。非常感谢!
【解决方案2】:

如果您使用完整的进程名称,您应该真正使用 -Cps 而不是凌乱的管道。如果您对子字符串匹配感兴趣,那么您的方式是我唯一能想到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2019-04-05
    相关资源
    最近更新 更多