Perbedaan antara doublequotes "", singlequotes '' dan backticks `` pada commandline?

43

Saya sering melihat tutorial di web atau posting di situs ini yang banyak menggunakan karakter berikut di baris perintah. Seringkali tampaknya mereka digunakan untuk tujuan yang cukup mirip. Apa perbedaan di antara mereka ketika digunakan pada baris perintah atau untuk pemrograman shell? Untuk tujuan apa saya menggunakan yang mana dari mereka?

" " double quotes

' ' single quotes

` ` backticks
NES
sumber

Jawaban:

43

Sebagai contoh, pertimbangkan variabel yang fooberisi uname( foo=uname).

  • echo "$foo"output uname, menggantikan variabel dalam teks.
    • Untuk $karakter literal di dalam "kutipan, gunakan \$; untuk literal ", gunakan \".
  • echo '$foo'output $foo, string yang tepat.
    • Bahkan 'tidak bisa diloloskan sebagai kutipan \'di dalam '. Tapi Anda bisa menggunakannya 'foo'\''bar'.
  • echo `$foo`output Linux, mengeksekusi konten variabel dan echomencetaknya.
shellholic
sumber
\selalu diperlakukan secara harfiah ketika dilampirkan dalam tanda kutip tunggal, bahkan jika itu mendahului a '. Setelah pembukaan ', yang berikutnya 'selalu ditafsirkan sebagai kutipan penutup. Sesuatu seperti mengutip 'dalam string kutipan tunggal dapat dicapai dengan mengakhiri penawaran, melarikan diri secara 'individual, dan mulai mengutip lagi. Artinya, sementara \'tidak bekerja antara 'karakter pembuka dan penutup , '\''tidak. (Lihat Gilles 's koreksi ke salah satu posting saya ketika saya telah membuat kesalahan yang sama untuk rincian.)
Elia Kagan
11

Ini dijelaskan dengan sangat baik di bagian yang relevan dari manual bash. Secara singkat, apa pun dalam kutipan tunggal ditafsirkan secara harfiah. Jadi, misalnya:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

Bandingkan dengan versi yang tidak dikutip:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

Kutipan ganda memungkinkan ekspansi variabel (juga ekspansi sejarah dan beberapa hal lainnya). Pada dasarnya, Anda menggunakannya ketika Anda berurusan dengan sesuatu yang ingin Anda lihat diperluas. Sebagai contoh:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

Dengan kata lain, tanda kutip tunggal benar-benar melindungi string dari shell sementara tanda kutip ganda melindungi beberapa hal (spasi misalnya) tetapi memungkinkan variabel dan karakter khusus untuk diperluas / ditafsirkan dengan benar.

terdon
sumber
1
tidak yakin apakah OP diubah setelah fakta, tetapi jawaban ini tidak menyebutkan backticks?
Alexander Mills
5

Kutipan tunggal ( '') digunakan untuk mempertahankan nilai literal dari setiap karakter yang disertakan dalam tanda kutip.

Menggunakan tanda kutip ganda ( ""), nilai literal dari semua karakter yang dilampirkan dipertahankan, kecuali untuk tanda dolar ( $), backticks (tanda kutip tunggal mundur, ``) dan garis miring terbalik ( \).

Ketika tertutup di dalam back-ticks ( ``), shell mengartikan sesuatu yang berarti "output dari perintah di dalam back-ticks." Ini disebut sebagai "substitusi perintah", karena output dari perintah diganti untuk perintah itu sendiri.

referensi:

aneeshep
sumber
3
echo '$HOME' is "$HOME"

Kutipan tunggal mencegah ekspansi variabel, sementara tanda kutip ganda memungkinkan.

ubfan1
sumber
2

Saya hanya berbicara secara umum tetapi:

""- Digunakan untuk memproses beberapa info di dalamnya sebelum dikeluarkan. (Seperti dalam PHP.)

  • Sebagai contoh: name=NESS; echo "Hello my name is $name"akan menampilkan:Hello my name is NESS

''- Digunakan untuk menunjukkan output apa adanya. (Juga suka di PHP.)

  • Menggunakan contoh di atas, itu akan ditampilkan Hello my name is $name

Jadi perbedaan antara tanda kutip ganda dan tunggal adalah bahwa tanda kutip ganda memproses variabel dan menunjukkan nilainya, sedangkan tanda kutip tunggal menunjukkan nama variabel tanpa pemrosesan.

`` - Digunakan untuk mengutip perintah yang nantinya ditugaskan ke variabel lain.

Luis Alvarado
sumber
1

Kutipan tunggal menyertakan nilai yang harus diambil secara harfiah: semua jenis ekspansi ditekan. Biasanya digunakan jika nilai meliputi atau mungkin termasuk spasi putih (spasi, tab, baru-line), atau karakter khusus ( $, \, `) bahwa pengguna tidak ingin diperluas / diperlakukan khusus oleh shell.

Kutipan ganda menyertakan nilai yang akan memiliki variabel, dan penggantian karakter dilakukan. Diperlukan saat output mungkin berisi spasi putih, dan harus ditetapkan sebagai nilai tunggal.

Kutipan kembali menyertakan perintah, yang hasilnya diinginkan sebagai nilai. Kerang yang lebih baru memungkinkan penggunaan $(...)di tempat `...`. Saya lebih suka metode yang lebih baru.

Kode berikut dapat membantu memahami apa yang terjadi.

CMD = 'ls.'
gema sq: $ CMD
set $ CMD
echo raw 1: $ 1
echo raw: $ *
set "$ CMD"
echo dq: $ 1
echo bq: `$ CMD`
gema baru: $ ($ CMD)
BillThor
sumber