
エスケープ文字のため拡張できません。
UNF\1122
今は非常に簡単な例を見てみましょう。
ps -ef | grep $USER
最終的にエスケープ文字を処理した後にこれを実行したいと思います。
ipcs -m | grep $USER | awk '{printf "%s ",$2}'
$USER
私はそれをするのでそれが価値があることを知っています。
$ echo $USER UNF\1122
なぜ管理者がユーザー名にを追加することにしたのか尋ねないでください\
。なぜなら私は知らないからです。
この問題を解決するために、一重引用符と二重引用符を使用してみました。私もこのようにユーザー名を変更しました。
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
$