シェルでバックスラッシュを処理する

シェルでバックスラッシュを処理する

他のシェルでバックスラッシュをecho処理する方法は?printfzshbash

下に次の動作が表示されます。

$ 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 echobashUNIXモードと同様に、標準モードで実行されます。つまり、\bUNIX仕様が要求するようにASCII BS文字に拡張されます。

echoランダムな文字列を表示するために使用しないでください。printf:

printf '%s\n' "$1"

print -r -- "$1"また、有効ですがksh/はzsh具体的です。

echo -E - "$1"zsh私はそれがいくつかのBSDで動作すると信じています。

cat << EOF
$1
EOF

printfBourneのようなシェルで動作します。数十年前にはコマンドがなかったシェルでも動作しますが、新しいプロセスを作成し、現在どこにいてもprintf実際には必要ありません。

rcところで、バックスラッシュはシェル(pythonを除くすべてのシェル)に特別なので、シェルコマンドラインからエスケープする必要があります。

$ foo '\\foo\bar'

foo \\foo\bar欠落しているバックスラッシュを再作成できない"\foo\bar"文字列を渡します。foo

おすすめ記事