何とか二重引用符が私のコードに入り、予期しない動作が発生しました。
#!/bin/sh
if [ foo = ‘foo’ ]; then
echo yes
else
echo no
fi
私はこれがyesで鳴ると予想しましたが、実際にはnoで鳴り響きました。
答え1
組版には改行引用符または「丸引用符」が使用され、「真の引用符」は、さまざまなワードプロセッシングプログラムによって自動的に丸引用符に変更されることがよくあります。引用されたテキストの向きを指定して乾燥するのはかなりインテリジェントなので、「スマート引用符」とも呼ばれます。
以下には、さまざまな引用符を含む表があります。
特徴 | 説明する | Windows/Unix | アップルシステム | ハイパーテキストマークアップ言語 |
---|---|---|---|---|
' | 直接一重引用符 | ' | ' | ' |
」 | まっすぐな二重引用符 | " | " | " |
' | 一重引用符を開く | alt+0145 | option+] | ‘ |
' | 一重引用符で終わる | alt+0146 | option+ shift+] | ’ |
」 | 二重引用符を開く | alt+0147 | option+[ | “ |
」 | 二重引用符の終わり | alt+0148 | option+ shift+[ | ” |
ただし、プログラミング言語では、これらの引用符を入れ替えて使用することはできません。まっすぐな引用符は通常、言語で特定の機能を実行する特殊文字ですが、同様に見える丸い引用符は特別と見なされません。代わりにエラーが発生したり、文字に似た一般的な文字として扱われることがあります。
したがって、この質問のコード例では、二重引用符はシェルエスケープ文字だけでなくリテラル文字として扱われるため、'foo'
一致しません。'‘foo’'
この問題を回避するには、コード編集用に設計されたプログラムでのみコードを編集する必要があり、ワードプロセッシングアプリケーション(LibreOffice Word、WordPad、Emailなど)、PDF文書、またはオンラインコードソースからコードをコピーするときは注意が必要です。
丸い引用符とまっすぐな引用符の視覚的な違いは微妙かもしれませんが、一般的に区別することができます。丸い引用符は通常、フォントに応じて傾いているか、小さな6または9に似ています。
同様の手順をod
使用して、通常のASCIIストレート引用符とUnicode丸引用符を区別できます。たとえば、次のテキストファイルには“foo”
1行に二重引用符があり、"foo"
別の行には真の引用符があります。 UTF-8ロケールでは、macOSとGNU / Linuxの出力はod -c
二重引用符が多いバイトを占めますが、まっすぐな引用符は多くのバイトを取得します。 1バイトのみ使用してください。
mac$ od -c test.txt
0000000 “ ** ** f o o ” ** ** \n " f o o " \n
0000020
gnu$ od -c test.txt
0000000 342 200 234 f o o 342 200 235 \n " f o o " \n
0000020
(上の画像では、macOSはod
最初の位置に文字全体を表示し、文字の残りのバイトを表示します**
が、下の画像では、GNUはod
文字のすべてのバイト値を8進数で表示します。)