特に編集 2 の後、これは本当に「おかしな」文字の問題のように見えます。印刷されていない文字が混在しているか、改行しないスペースのような通常のように見えますが奇妙な文字です。これらは検出がかなり難しい場合があります。エディターではまったく正常に見えることがありますが、スクリプトをそのようなもので表示したとしても、cat -v
おかしな文字がはっきりと表示されるとは限りません。システムにある場合xxd
、ファイルの内容を正確に確認するのに非常に良い方法です。このタイプの問題の簡単なデモを次に示します。
$ cat -v nbsptest
#!/bin/bash -x
[ -e /tmp ] && date
[ -e /tmp ] && date
[ -e /tmp ] && date
$ ./nbsptest
+ '[ -e' /tmp ']'
./nbsptest: line 2: [ -e: command not found
+ '[' -e '/tmp ]'
./nbsptest: line 3: [: missing `]'
+ '[' -e /tmp ']'
+ date
Sat Jun 30 10:53:56 PDT 2012
$ xxd nbsptest
0000000: 2321 2f62 696e 2f62 6173 6820 2d78 0a5b #!/bin/bash -x.[
0000010: c2a0 2d65 202f 746d 7020 5d20 2626 2064 ..-e /tmp ] && d
0000020: 6174 650a 5b20 2d65 202f 746d 70c2 a05d ate.[ -e /tmp..]
0000030: 2026 2620 6461 7465 0a5b 202d 6520 2f74 && date.[ -e /t
0000040: 6d70 205d 2026 2620 6461 7465 0a mp ] && date.
スクリプトはcat -v
(and more
、vi
、など) で完全に正常に見えますが、最初の 2 つのコマンドは失敗します。 xxd
理由を示します: 最初のコマンドは と の間に UTF-8 改行なしスペースが[
あり-e
(これはテキスト リストの 16 進リストでは c2a0 として示され[..-e
ます)、2 番目のコマンドはテキスト リストの(/tmp
と) の間に改行なしスペースがあります。]
/tmp..]
-x
ディスプレイ(私はそれbash -x
を呼び出していましたが、set -x
@CodeGnomeが提案したように使用することもできます)は、何が起こっているかについてのヒントも提供します。最初のコマンドでは、'[ -e' /tmp ']'
-- の周りの引用符に注意してください[ -e
。これは、シェルがすべてを 1 つの「単語」として扱っていることを示しています。同様に、2 番目のコマンドは、すべて 1 つの「単語」'[' -e '/tmp ]'
であると見なされていることを示す引用符付きで表示されます。/tmp ]