bash脚本/ pgrep没有按预期工作

时间:2012-02-20 16:32:59

标签: bash shell

我有一个bash脚本试图用参数调用pgrep(Over simplified):

PATTERN="'/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf\$'"
pgrep -f $PATTERN
echo pgrep -f $PATTERN

提供以下输出:

Usage: pgrep [-cflvx] [-d DELIM] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
        [-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]
pgrep -f '/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf$'

我认为这意味着参数不会传递给pgrep,但由于某种原因传递给echo。

我期待的是:

7632
pgrep -f '/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf$'

当我单独运行preg行时,它会按预期输出7632。

我在这里做错了吗?我试过sh,dash和bash。同样的结果,我真的没有看到问题。

2 个答案:

答案 0 :(得分:3)

您需要用双引号括起 PATTERN

PATTERN="/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf\$"
pgrep -f "$PATTERN"

请参阅:quoting variables

编辑:并且为了回应我会这样做:

echo pgrep -f \'$PATTERN\'

答案 1 :(得分:2)

因为我没有可以测试的lighttpd.bin,所以我提交了一个未经测试的选项,主要是同意@barti_ddu,但是扭曲略有不同

PATTERN='/opt/apps/bin/lighttpd.bin -f /opt/apps/etc/lighttpd/lighttpd.conf\$'
pgrep  -f "$PATTERN"
echo pgrep  -f "$PATTERN"

我会保留对PATTERN的单引号,但完全同意在使用pgrep或echo时需要dbl引用。

我希望这会有所帮助。