「純粋な」UNC(つまり、文字通りバックスラッシュをエスケープしたくない)をパラメータとして使用するbashスクリプトを作成したいと思います。つまり、次のようになります。
./foo \\my\share\is\here
しかし、当然、上記のスクリプトは次のようになります。
\私の共有はここにあります
どういうわけか正確なUNCをパラメータとして読み込み、それを変数に保存できますか?
答え1
一重引用符を使用してください。
[root@xxx601 ~]# ./stack \\my\share\is\here
You Gave Me: \myshareishere
[root@xxx601 ~]# ./stack '\\my\share\is\here'
You Gave Me: \\my\share\is\here
答え2
シェルスクリプトで./foo
引数を使用してコマンドを実行するには、任意の形式を使用する必要があります。\\my\share\is\here
引用する、バックスラッシュ文字はシェルで特別な意味を持つからです。最も簡単な引用形式は、パラメータを一重引用符で囲むことです。一重引用符ペア間のすべての内容は文字通り処理され、この方法で含めることができない唯一の文字は一重引用符文字自体です。
./foo '\\my\share\is\here'
スクリプトがあり、foo
引数を使用してコマンドラインで実行する場合は、引用符も\\my\share\is\here
使用する必要があります(コマンドラインはシェルです)。
と入力すると、./foo \\my\share\is\here
何foo
を入力したのかわかりません。実行中のシェルはfoo
コマンドラインを解析し./foo
、次のスペースが単語区切り文字であるか、最初の単語は実行するコマンド名、2番目の単語は引数、文字の順序はバックスラッシュ+何か形式であることを確認します。役割を表すものです。これはあなたが書いたのと同じ現象ですfoo ; bar
。実行されるシェルコマンドの場合、foo
文字列はbar
渡されません。同様に、引数を使用して実行します。たとえば、パラメータを使用して実行するには、その内容(または他のバリアント)を書き留める必要があります。; bar
foo
./foo \\my\share\is\here
./foo
\myshareishere
./foo
\\my\share\is\here
./foo '\\my\share\is\here'
./foo \\\\my\\share\\is\\here
./foo '\'"\\m"y\\share'\is\'"here"""