
escape
私は次のように動作する関数を作成しようとしています。呼び出します。
% IFS=$' \t\n\000'
% escape FOO $IFS
FOO=$' \t\n\000'
つまり、escape
2つのパラメータを取り、最初のパラメータを変数名として使用すると、zsh行が印刷されます。ソースコードここで、その名前の変数には引用符で囲まれた$''
「標準print
エスケープ」文字列が割り当てられ、このソースコード行が評価されると、最初の引数と呼ばれる変数は2番目の引数を値にします。 (私はこれが泥のように明確であると確信しているので、escape
この記事の終わりにどのように機能するかについてのより多くの例を提供します。)
以下は関数の不完全な実装ですescape
。
escape () {
local varname=$1
local value="$2"
print -n "$varname=\$'"
# ???
print "'"
}
欠けている部分(とマーク???
)は、コンテンツが$value
「正規にprint
エスケープされた」部分です。print
識別できる表現が少なくとも複数ある文字が多いため、「正規」修飾子が必要です。たとえば、asとasも知られていますprint
。この場合は標準形式です。通常、標準エスケープシーケンス、などはその文字の標準形式です。印刷可能なASCII文字(例えば、、)の標準表示形式が標準化されています。残りの文字に対して表現選択が与えられると、標準形式として8進形式を選択しますが(少なくとも; より高いコードを処理する方法がわかりません)、その好みは強力ではありません。\n
\012
\C-J
\n
\n
\r
\t
A
=
9
\177
$''
もちろん、私はこの機能を「最初から」実装するコードを見たくありません。代わりに、print
バイトをエスケープされたテキスト表現に変換するユーティリティがすでに存在していればと思います。
どんなアドバイスもありがとうございました!
escape
以下はいくつかの実際の例です(仮説)。
% escape HELLO $( echo 'hello world' )
HELLO=$'hello world\n'
% escape SUBSEP $( perl -e 'print $;' )
SUBSEP=$'\034'
% abc=$'\141\012\142\012\143\012'
% print -n $abc
a
b
c
% escape ABC $abc
ABC=$'a\nb\nc\n'
答え1
私の考えではq
パラメータ拡張フラグ、特にqqqq
変形。
FOO=${(qqqq)IFS}
したがって、次の関数を作成できます(フラグを使用して名前付きパラメータを拡張するP
)$2
。
escape () {
print -r -- "$1=${(Pqqqq)2}"
}