带转义字符的扩展

带转义字符的扩展

由于转义字符,我无法对此进行扩展。

UNF\1122

现在我试图坚持使用一个非常简单的例子:

ps -ef | grep $USER

最终,在处理转义字符后,我想这样做。

ipcs -m | grep $USER | awk '{printf "%s ",$2}'

我知道$USER它有价值,因为我这样做了。

$ echo $USER UNF\1122

请不要问我为什么管理员决定\在用户​​名中添加 a,因为我不知道。

为了解决这个问题,我尝试了单引号和双引号。我也尝试过像这样更改用户名。

USER="UNF\\\\1122" and USER='UNF\\1122'

答案1

很棘手,因为根据实用程序 a\1可能具有含义,例如 中的反向引用grep,但 中则不然getent。壳插值也使事情变得复杂。

# getent sees a\\b, cannot find this literal string
$ getent passwd 'a\\b'

# let the shell interpolate \\ to \ so getent sees a\b
$ getent passwd a\\b
a\b:x:9999:9999:Slash Gordon:/:/bin/sh

# or no iterpolation, literal a\b passed to getent
$ getent passwd 'a\b'
a\b:x:9999:9999:Slash Gordon:/:/bin/sh

# oops, shell interpolated \\ to \ and thus grep sees \b metacharacter
$ grep "a\\b" /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
a\b:x:9999:9999:Slash Gordon:/:/bin/sh

# oops, also shell interpolation, so grep sees a\b metachar
$ grep a\\b /etc/passwd
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
a\b:x:9999:9999:Slash Gordon:/:/bin/sh

# no interpolation, pass \\ to grep, which then treats as literal \
$ grep 'a\\b' /etc/passwd
a\b:x:9999:9999:Slash Gordon:/:/bin/sh
$ 

相关内容