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

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

他のシェルでバックスラッシュを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

答え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シェルで見られる動作を得ることができます。

関連情報