Bashの単一引用符と二重引用符の違い

616
jrdioko 2011-07-15 07:55.

Bashでは、一重引用符('')と二重引用符("")の違いは何ですか?

6 answers

632
Adam Batkin 2011-07-15 07:57.

一重引用符は何も補間しませんが、二重引用符は補間します。例:変数、バックティック、特定の\エスケープなど。

例:

$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")

Bashのマニュアルには次のように書かれています。

3.1.2.2一重引用符

文字を一重引用符(')で囲むと、引用符内の各文字のリテラル値が保持されます。バックスラッシュが前に付いている場合でも、一重引用符の間に一重引用符が表示されない場合があります。

3.1.2.3二重引用符

(二重引用符で文字を囲む")を除いて、全ての文字のリテラル値を保持し$`\、履歴展開が有効になっている場合、および!。文字$`その特別な意味は二重引用符で囲みます(シェル拡張を参照)。次のいずれかの文字が続いたときにバックスラッシュが唯一のその特別な意味を保持:$`"\、または改行。二重引用符内で、これらの文字の1つが後に続く円記号は削除されます。特別な意味のない文字の前にある円記号は変更されません。二重引用符は、その前に円記号を付けることにより、二重引用符内で引用できます。有効に!すると、二重引用符で囲まれた部分が円記号を使用してエスケープされない限り、履歴の展開が実行されます。の前の円記号!は削除されません。

特別なパラメーター*@は、二重引用符で囲む場合に特別な意味を持ちます(シェルパラメーターの拡張を参照)。

301
codeforester 2017-02-07 20:14.

受け入れ答えは素晴らしいです。トピックをすばやく理解するのに役立つテーブルを作成しています。説明には、単純な変数aとインデックス付き配列が含まれますarr

設定した場合

a=apple      # a simple variable
arr=(apple)  # an indexed array with a single element

次にecho、2番目の列の式を使用すると、3番目の列に示されている結果/動作が得られます。4番目の列は動作を説明しています。

 # | Expression  | Result      | Comments
---+-------------+-------------+--------------------------------------------------------------------
 1 | "$a" | apple | variables are expanded inside "" 2 | '$a'        | $a | variables are not expanded inside '' 3 | "'$a'"      | 'apple'     | '' has no special meaning inside ""
 4 | '"$a"' | "$a"        | "" is treated literally inside ''
 5 | '\''        | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting) 6 | "red$arocks"| red         | $arocks does not expand $a; use ${a}rocks to preserve $a
 7 | "redapple$" | redapple$   | $ followed by no variable name evaluates to $
 8 | '\"'        | \"          | \ has no special meaning inside ''
 9 | "\'"        | \'          | \' is interpreted inside "" but has no significance for '
10 | "\""        | "           | \" is interpreted inside ""
11 | "*"         | *           | glob does not work inside "" or ''
12 | "\t\n"      | \t\n        | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting
13 | "`echo hi`" | hi          | `` and $() are evaluated inside "" 14 | '`echo hi`' | `echo hi` | `` and $() are not evaluated inside ''
15 | '${arr[0]}' | ${arr[0]}   | array access not possible inside ''
16 | "${arr[0]}" | apple | array access works inside "" 17 | $'$a\'' | $a'         | single quotes can be escaped inside ANSI-C quoting
18 | "$'\t'" | $'\t'       | ANSI-C quoting is not interpreted inside ""
19 | '!cmd'      | !cmd        | history expansion character '!' is ignored inside ''
20 | "!cmd"      | cmd args    | expands to the most recent command matching "cmd"
21 | $'!cmd'     | !cmd        | history expansion character '!' is ignored inside ANSI-C quotes
---+-------------+-------------+--------------------------------------------------------------------

参照:

  • ANSI-Cの引用$''-GNUBashマニュアル
  • ロケール翻訳$""-GNUBashマニュアル
  • 見積もりの​​3点式
235
likso 2011-07-15 08:02.

何かをエコーし​​たときに何が起こるかを参照している場合、一重引用符は文字通りそれらの間にあるものをエコーし​​、二重引用符はそれらの間の変数を評価して変数の値を出力します。

たとえば、これ

#!/bin/sh
MYVAR=sometext
echo "double quotes gives you $MYVAR" echo 'single quotes gives you $MYVAR'

これを与えるでしょう:

double quotes gives you sometext
single quotes gives you $MYVAR
14
Sree 2018-07-15 08:21.

他の人は非常によく説明し、簡単な例を挙げたいだけです。

シェルが特殊文字を解釈しないように、テキストを一重引用符で囲むことができます。ドル記号、スペース、アンパサンド、アスタリスク、およびその他の特殊文字は、一重引用符で囲むとすべて無視されます。

$ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.' 

それはこれを与えるでしょう:

All sorts of things are ignored in single quotes, like $ & * ; |.

一重引用符で囲むことができないのは一重引用符だけです。

二重引用符は一重引用符と同様に機能しますが、二重引用符を使用すると、シェルでドル記号、逆引用符、円記号を解釈できる点が異なります。バックスラッシュが単一の特殊文字の解釈を妨げることはすでに知られています。これは、変数ではなくドル記号をテキストとして使用する必要がある場合に、二重引用符で囲むと便利です。また、二重引用符をエスケープして、引用符で囲まれた文字列の終わりとして解釈されないようにすることもできます。

$ echo "Here's how we can use single ' and double \" quotes within double quotes"

それはこれを与えるでしょう:

Here's how we can use single ' and double " quotes within double quotes

また、引用符で囲まれた文字列の先頭として解釈されるアポストロフィは、二重引用符内では無視されることに注意してください。ただし、変数は解釈され、二重引用符で囲まれた値に置き換えられます。

$ echo "The current Oracle SID is $ORACLE_SID"

それはこれを与えるでしょう:

The current Oracle SID is test

逆引用符は、一重引用符または二重引用符とはまったく異なります。特殊文字の解釈を防ぐために使用される代わりに、バッククォートは実際にはそれらが囲むコマンドの実行を強制します。同封のコマンドが実行された後、それらの出力は元の行の後ろ引用符の代わりに置き換えられます。これは例でより明確になります。

$ today=`date '+%A, %B %d, %Y'` $ echo $today 

それはこれを与えるでしょう:

Monday, September 28, 2015 
5
a_r 2018-08-19 22:43.

' 'との使用法には明確な違いがあり" "ます。

' 'を使用する場合、「変換または変換」は行われません。そのまま印刷されます。

" "、それが囲むものは何でも、その値に「変換または変換」されます。

翻訳/変換とは、次のことを意味します。一重引用符で囲まれたものは、その値に「翻訳」されません。それらは引用符の中にあるので取られます。例:a=23、は標準出力でecho '$a'生成さ$aれます。一方、標準出力でecho "$a"生成さ23れます。

3
Inian 2019-01-03 06:18.

これはで引用符を扱うときの事実上の答えなのでbash、シェルで算術演算子を扱うときに、上記の答えで見逃したもう1つのポイントを追加します。

bashシェルは2つの方法が演算を行うサポート、によって定義さ組み込みletコマンドと$((..))オペレータ。前者は算術式を評価しますが、後者はより複合的なステートメントです。

で使用される算術式は、let他のシェルコマンドと同じように、単語分割、パス名展開が行われることを理解することが重要です。したがって、適切な引用とエスケープを行う必要があります。

使用する場合は、この例を参照してください let

let 'foo = 2 + 1'
echo $foo
3

ここでは変数展開の必要がないため、ここで一重引用符を使用することは絶対に問題ありません。

bar=1
let 'foo = $bar + 1'

$bar一重引用符の下拡張され、次のように二重引用符で囲む必要があるため、惨めに失敗します。

let 'foo = '"$bar"' + 1'

これが理由の1つであるはずであり、$((..))を使用することを常に検討する必要がありますlet。その中身は単語分割の対象ではないからです。を使用した前の例letは、次のように簡単に記述できます。

(( bar=1, foo = bar + 1 ))

常に$((..))一重引用符なしで使用することを忘れないでください

$((..))二重引用符で使用できますが、二重引用符を必要とするコンテンツを含めることができないため、目的はありません。一重引用符で囲まれていないことを確認してください。

printf '%d\n' '$((1+1))' -bash: printf: $((1+1)): invalid number
printf '%d\n' $((1+1)) 2 printf '%d\n' "$((1+1))"
2

$((..))一重引用符で囲まれた文字列内で演算子を使用する特殊なケースでは、演算子が引用符で囲まれていないか、二重引用符で囲まれるように引用符を補間する必要があります。たとえば、curlステートメント内で演算子を使用して、要求が行われるたびにカウンターを渡す必要がある場合を考えてみましょう。

curl http://myurl.com --data-binary '{"requestCounter":'"$((reqcnt++))"'}'

内部でネストされた二重引用符が使用されていることに注意してください。これがないと、リテラル文字列$((reqcnt++))requestCounterフィールドに渡されます。

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ラーム・エマニュエルがシカゴ警察の警視を解雇し、身を守る

ラーム・エマニュエルがシカゴ警察の警視を解雇し、身を守る

シカゴ市長のラーム・エマニュエルは、シカゴの警察官による17歳のラカン・マクドナルドの銃撃の失敗した取り扱いに続いて、市の警視官、ギャリーF.マッカーシーを解雇しました。

ダグ・マローネの理想的な食事は、ボローニャのサンドイッチです。

ダグ・マローネの理想的な食事は、ボローニャのサンドイッチです。

写真:ローガンボウルズ/ゲッティイメージズジャイアンツがベンマカドゥーを解雇したので、他の誰かがジムトムスラの精神的後継者でなければなりません。季節だった。ジャガーズのダグ・マローネ監督は、孤独なボローニャサンドイッチに親しみを持っていることを考えると、すでにその役割を担う有力な候補者のようです。

人々がやめる最も一般的な時間、およびプッシュスルーする方法

人々がやめる最も一般的な時間、およびプッシュスルーする方法

時には、それが副次的なプロジェクト、仕事、人間関係、または人生の他の部分であるかどうかにかかわらず、辞めることが最良の選択肢です。しかし、何かを完了するためのリソースがないため、物事が困難になったとき、タイミングが私たちに必要なように「感じ」させたときにも、私たちは辞めます。

黒人女性、あなたの内訳へようこそ

黒人女性、あなたの内訳へようこそ

著者のベニルデ・リトルは、母親の死後のうつ病との戦いを新しい回想録「Welcome toMyBreakdown」で記録しています。チェスター・トイの作家ベニルデ・リトルは、黒人女性にそれが大丈夫だと知ってもらいたいと思っています。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language