cat を使用できます -A で オプション:マニュアルから:
-A, --show-all
equivalent to -vET
-E, --show-ends
display $ at end of each line
-T, --show-tabs
display TAB characters as ^I
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
だから cat -A yourscrip.sh 目に見えない奇妙なキャラクターが表示されます。
1 つのオプションは、使用しようとしている文字を 16 進ビューアーまたはエディターで調べることです。 hexdump 端末に限定されている場合は、良いオプションです。
$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000 5b 20 2d 66 20 2f 65 74 63 2f 6f 70 65 6e 76 70 |[ -f /etc/openvp|
00000010 6e 2f 63 6c 69 65 6e 74 2e 63 6f 6e 66 20 5d 20 |n/client.conf ] |
00000020 26 26 20 65 63 68 6f 20 74 72 75 65 0a |&& echo true.|
0000002d
space が 、 close-square-brace 、 space 正しい - 0x20 、 0x5D 、 0x20 .
これらの値は 16 進数で表示される ASCII コードです。 0x20 の範囲外の値 - 0x7E は「印刷可能な文字」ではありません " ASCII に関する限り、おそらくコマンド ライン インターフェイスではうまく機能しません。
注: あなたの最初の「壊れた」をコピーしました " hexdump で使用する行 上記の例では、not-an-ASCII-space が何かに置き換えられています 元のソースとレンダリングされた質問の間に ASCII スペースを挿入してください。
これを繰り返すには、次の手順を実行します:
<オール>hexdump -Cv <<"EOF"と入力してください Enterを押します EOFと入力してください 独自の行に入力し、Enter を押します あなたが発見したように、端末とコマンドラインインターフェイスは特殊文字をうまく処理しません。ドキュメントの書式設定に十分注意しないと、Microsoft Word (およびその他) で「スマート クォート」を使用する際にも問題が発生します。 "、全角ダッシュ、リストは続きます...
違いを見つけましょう:(一番上は「スマート クォート」です "、一番下は "ストレート クォート ")

$ hexdump -Cv <<"EOF"
> “quoted string”
> EOF
00000000 e2 80 9c 71 75 6f 74 65 64 20 73 74 72 69 6e 67 |...quoted string|
00000010 e2 80 9d 0a |....|
00000014
ここで、開始引用符は単純な ASCII 引用符ではありません (" )、ただし Unicode / UTF-8 シリーズ - 0xE2 、 0x80 、 0x9C 、または U+201C - 端末は期待どおりに処理しません。
cat -A の Kiwy の提案 仕事もします:
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
注: echo "..." | hd を使用する場合 、検査しようとしている文字列の一部をbashが置き換える可能性があります。これは、スクリプトのコンポーネントを検査しようとするときに特に懸念されます。
たとえば、試してみてください:
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
これらのメソッドは、コンポーネントを関連するテキストに置き換えています。これを回避するには、次のいずれかの方法を使用します。一重引用符の使用に注意してください (' )、および「引用されたヒアドキュメント " ("EOF" ).
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}
echo "<your command>" | hd 動作するはずです。バックスペース (0x08) またはコードが 80 以上の文字を探します。 echo "<your command>" | wc -b また、カウントが表示されているものと一致することを確認することもお勧めします。
名前に「Office」が含まれるものによって作成されたファイルから内容をコピーすることは危険です。そのようなソフトウェアはしばしば文字を自由に置き換えるためです。同等の開閉。私がこれまでに見つけた中で最も困難なものは、ファイル名の途中に幅 0 の改行なしスペースがあることでした (3 日間のサーバー ダウンタイム...)。