
他のシェルでバックスラッシュをecho
処理する方法は?printf
zsh
bash
下に嘚次の動作が表示されます。
$ echo "foo\bar\baz"
foaaz
$ echo "foo\\bar\\baz"
foaaz
$ echo 'foo\bar\baz'
foaaz
$ echo 'foo\\bar\\baz'
foo\bar\baz
下に強く打つ、状況がより一貫しているようです。
bash$ echo "foo\bar\baz"
foo\bar\baz
bash$ echo 'foo\bar\baz'
foo\bar\baz
bash$
しかし、より具体的に言えば:次のバックスラッシュを含む文字列を渡す方法\\foo\bar\something
到着する:
echo
printf
print
同じ文字列を取得しますか?(とzsh
一緒にbash
)?
以下は、zshの機能を使用した別の実験です。
function foo
{
echo -E '$1'
}
$ foo \\here\is\some\path
$1
どのように印刷できますか\\here\is\some\path
?
アップデート(注:Stephenのコメントから回答しました)
zsh 5.0.2で次のことを試しました。
function foo
{
printf '$s\n' $1
}
foo '\\some\path'
しかし、これは出力されますか$s
?
答え1
zsh
echo
bash
UNIXモードと同様に、標準モードで実行されます。つまり、\b
UNIX仕様が要求するようにASCII BS文字に拡張されます。
echo
ランダムな文字列を表示するために使用しないでください。printf
:
printf '%s\n' "$1"
print -r -- "$1"
また、有効ですがksh
/はzsh
具体的です。
echo -E - "$1"
zsh
私はそれがいくつかのBSDで動作すると信じています。
cat << EOF
$1
EOF
printf
Bourneのようなシェルで動作します。数十年前にはコマンドがなかったシェルでも動作しますが、新しいプロセスを作成し、現在どこにいてもprintf
実際には必要ありません。
rc
ところで、バックスラッシュはシェル(pythonを除くすべてのシェル)に特別なので、シェルコマンドラインからエスケープする必要があります。
$ foo '\\foo\bar'
foo \\foo\bar
欠落しているバックスラッシュを再作成できない"\foo\bar"
文字列を渡します。foo
答え2
新しい答え: read -r var
-r raw input - disables interpretion of backslash escapes and line-continuation in the read data
以下を表示します。
printf "%s" "$var"
echo "$var"
動作する必要があります。
したがって、foo機能の場合:
function foo
{
read -r var
echo -E "var is : ${var}"
}
$ foo
\\here\is\some\path
var is : \\here\is\some\path
以下の以前の回答(答えではありませんが便利かもしれません^^)
それぞれを交換して、\
シェル\\
に「\
私が望むもの」と伝えます。そうでなければ(あなたの例ではzshのように)\b
「1バックスペース」などを意味する可能性が高いです。
たとえば、sed を使用できます。
sed -e 's,\\,\\\\,g' < the_original > the_escaped_backslaches_version
(ここでどのように "\"をエスケープするかを確認し、sedに "私が望む文字通りの" \"です。)
答え3
通常、バックスラッシュのためできません。はいエスケープ文字(したがってリテラル値が必要な場合はエスケープする必要があります)BASHはこの目的のために一重引用符を提供しますが、一重引用符で囲まれた文字列内ではエスケープされた一重引用符を使用できません。
違いはecho
組み込みであり、シェルによって(ある程度)異なる動作をすることができるということです。たとえば、BASH組み込みには-e
バックスラッシュシーケンスを解釈するように指示するオプションがあります。これにより、Zシェルで見られる動作を得ることができます。