GNU/Linux >> Linux の 問題 >  >> Linux

Bashシェルでのシングルクォートとダブルクォートの違い

Linuxコマンドラインでは引用符をよく使用します。ファイル名のスペースを処理しますか?引用符を使用します。特殊文字を処理しますか?もう一度引用符を使用します。

引用符はLinuxシェルの「特別な機能」であり、特にLinuxコマンドとシェルスクリプトを初めて使用する場合は混乱する可能性があります。

さまざまな種類の引用文字と、シェルスクリプトでのそれらの使用法について説明します。

引用文字には4つの異なるタイプがあります:

  • 一重引用符'
  • 二重引用符"
  • バックスラッシュ\
  • バッククォート`

バックラッシュを除いて、残りの3つの文字はペアで発生します。

それらを詳しく見てみましょう。

1。一重引用符

Shellの単一引用符は、その中のすべてのタイプの特殊文字を無視します。一重引用符の間のすべては、単一の要素と見なされます。

例を挙げてみましょう。これは、90年代のクリケット選手を含むサンプルテキストファイルです。

[email protected]:~$ cat cricket 
Allan Donald, South Africa
Steve Waugh, Australia
Mark Waugh, Australia
Henry Olonga, Zimbabwe
Sachin Tendulkar, India

ここで、grepコマンドを使用して、家系の名前がWaughのクリケット選手を探します。これにより、2つの結果が得られます:

[email protected]:~$ grep Waugh cricket
Steve Waugh, Australia
Mark Waugh, Australia

ただし、Steve Waughのみを検索し、それをそのまま使用しようとすると、エラーが表示されます。

[email protected]:~$ grep Steve Waugh cricket
grep: Waugh: No such file or directory
cricket:Steve Waugh, Australia

なんで?コマンド、オプション、および引数を区切るためにスペースが使用されるため。上記の例では、Steveが必要です grepの最初の引数として、ただしWaugh およびcricket 検索を実行する必要のあるファイルと見なされます。 Waughという名前のファイルがないため 、そのためのエラーをスローします。同時に、ファイルcricketの結果も表示されます。 。

これは引用が救助に来るところです。引数を引用符で囲むと、単一のエンティティとして解釈されます。

[email protected]:~$ grep 'Steve Waugh' cricket
Steve Waugh, Australia

基本的に、シェルが最初の一重引用符を見ると、別の一重引用符(閉じ引用符)が見つかるまで、特殊文字(空白も特殊文字)を無視します。

すべての特殊文字を無視する

一重引用符で囲むと、すべての特殊文字の意味が失われます。例を挙げて見てみましょう。

シェルで変数を宣言しましょう。変数名を$とエコーすると、変数の値が表示されます。

[email protected]:~$ var=my_variable
[email protected]:~$ echo $var
my_variable

ただし、一重引用符で囲むと、$はその特別な力を失います。

[email protected]:~$ echo '$var'
$var

今それだけ。エンターキーも一重引用符で囲みます。

[email protected]:~$ echo 'how are
> you?'
how are
you?

2。二重引用符

二重引用符は、一重引用符とほぼ同じように機能します。ほとんどの場合、以下を除くすべての特殊文字も無視する傾向があるためです。

  • ドルは$に署名します
  • 引用符`
  • 円記号\

ドル記号は無視されないため、変数名がその値に置き換えられることが期待できます。一重引用符の場合はそうではありません。

[email protected]:~$ var=my_variable
[email protected]:~$ echo "$var"
my_variable
[email protected]:~$ echo '$var'
$var

二重引用符は、シェルから一重引用符を隠すために使用できます。

[email protected]:~$ var=My 'own villa' is yellow
own villa: command not found
[email protected]:~$ var="My 'own villa' is yellow"
[email protected]:~$ echo $var
My 'own villa' is yellow

同様に、一重引用符を使用して、シェルから二重引用符を非表示にすることができます。

[email protected]:~$ var=he said, "Awesome!"
said,: command not found
[email protected]:~$ var='he said, "Awesome!"'
[email protected]:~$ echo $var
he said, "Awesome!"

3。バックスラッシュ

バックスラッシュは、単一の文字を一重引用符で囲むようなものです。バックスラッシュは、前に置かれた文字を「エスケープ」します。

これは、文字の後にバックスラッシュが続くと、その特別な意味が失われることを意味します(存在する場合)。

[email protected]:~$ var=variable
[email protected]:~$ echo \var
var
[email protected]:~$ echo $var
variable
[email protected]:~$ echo \$var
$var

v 特別な意味はありません。echo \var 単にvarを出力します。一方、$varと一緒に使用する場合 、バックスラッシュは$の特別な意味をエスケープします したがって、$varとして出力されます。 varの値の代わりに 。

バックスラッシュで行を続ける

1つのコマンドを複数行にわたって続行する場合のバックスラッシュ文字の別の実用的な使用法に気付くでしょう。

コマンドが長すぎる場合、またはコマンドの組み合わせである場合、バックスラッシュを使用して単一のコマンドを複数行に表示するWebサイトが表示されます。これにより、コマンド/コードが読みやすくなります。

この長いコマンドを例にとってみましょう。

docker run --name server --network net -v html:/usr/share/nginx/html -v $PWD/custom-config.conf:/etc/nginx/nginx.conf -p 80:80 --restart on-failure -d nginx:latest

バックスラッシュを使用すると、同じコマンドを複数行に分割できます。

docker run --name server --network net \
-v html:/usr/share/nginx/html \
-v $PWD/custom-config.conf:/etc/nginx/nginx.conf \
-p 80:80 --restart on-failure -d nginx:latest

これは同じコマンドですが、少しわかりやすくなっています。

二重引用符で囲まれた円記号

バックスラッシュは、ドル記号と逆引用符とともにその特別な意味を保持する3つの特殊文字の1つです。

このように、円記号を使用して、ドル記号、二重引用符、および二重引用符で囲まれた逆引用符の特別な意味を回避できます。

以下の例を見てください。$5 は宣言されていない変数と見なされるため、値はありません。これが、echoコマンドの出力から無視される理由です。

[email protected]:~$ echo "Meal costs $5.25"
Meal costs .25

変数の値として解釈されずにこの$を使用するには、/でエスケープする必要があります。

[email protected]:~$ echo "Meal costs \$5.25"
Meal costs $5.25

ここで、バックスラッシュ(\)は、後続の文字の特別な意味を回避するための超大国として解釈されます。

4。逆引用符

このリストの最後は逆引用符であり、特別な意味があります。コマンド置換に使用されます。

シェルには、指定されたコマンドがコマンドの出力に置き換えられるこのコマンド置換機能があります。

以下の例では、 `date`は、Linuxシステムの現在の日付と時刻を示すdateコマンドの出力に置き換えられています。

[email protected]:~$ echo The current date and time is `date`
The current date and time is Monday 23 August 2021 04:55:18 PM IST

覚えておくべきことの1つは、後引用符の間にコマンドがある場合にのみ置換が行われるということです。それ以外の場合は、そのまま表示されます。

[email protected]:~$ echo 'The current date and time is `late`'
The current date and time is `late`

繰り返しますが、二重引用符は逆引用符を解釈しますが、一重引用符はその特別な意味を無視します。

バッククォートは推奨されなくなりました

何年もの間、バッククォートはシェルスクリプトのコマンド置換に使用されていました。しかし、最近のUNIXおよびLinuxシステムは、$(command)を好みます。 代わりに構築します。

[email protected]:~$ echo The current date and time is $(date)
The current date and time is Monday 23 August 2021 05:55:47 PM IST

時間にとどまり、今すぐ引用符の使用をやめてください。

Linuxの引用符とシェルスクリプトについて理解を深めていただければ幸いです。

コメントセクションに提案や質問を残してください。


Linux
  1. ログインシェルと非ログインシェルの違いは?

  2. 組み込みコマンドとそうでないコマンドの違いは?

  3. [[$ a ==Z*]]と[$a==Z *]の違いは?

  1. エクスポートされたシェル変数とBashにないシェル変数の違いは?

  2. Linux –`su-`と`su–login`の違いは何ですか?

  3. Nohup とアンパサンドの違いは何ですか

  1. #!/usr/bin/env bash と #!/usr/bin/bash の違いは何ですか?

  2. 一重引用符と二重引用符の両方を含む bash エイリアス コマンド

  3. Bash の ${} と $() の違い