Spasi dalam penugasan variabel dalam skrip shell

17

Apa perbedaan antara penugasan variabel di bawah ini?

var=23
var =23
var= 23
var = 23

Apakah ada perbedaan ruang di sekitar operator penugasan?

ajay
sumber
Dalam sebagian besar bahasa pemrograman ini tidak ada bedanya sama sekali ... Apakah sebenarnya ada perbedaan untuk memulai? Anda juga berbicara oldschool sh di sini? bukan ash / zsh / bash atau hal baru lainnya?
Cadangan
Hanya contoh pertama yang menetapkan variabel.
DisplayName
Maka jangan 3 terakhir hanya melemparkan kesalahan sintaks? atau apakah mereka benar-benar memiliki makna?
Cadangan
2
@ Konservasi mereka dapat berarti sesuatu, jika Anda memiliki perintah yang dipanggil varmaka var =23akan lulus =23ke var, dan var = 23akan lulus =dan 23ke var. Atau, jika Anda memiliki perintah yang dipanggil var=maka var= 23akan lolos 23ke perintah var=.
DisplayName
1
@Cestarian Diganti oleh bash, yang melakukan hal yang persis sama seperti shdalam keempat kasus.
pfnuesel

Jawaban:

14

Itu sangat tergantung pada shell. Jika kita hanya melihat 4 famili shell utama (Bourne, csh, rc, fish):

Keluarga Bourne

Itu adalah Bourne shell dan semua variannya dan ksh, bash, ash/ dash, zsh, yash.

  • var=23: itulah sintaks penugasan variabel yang benar: kata yang terdiri dari huruf yang tidak dikutip, digit atau garis bawah diikuti oleh tanda kutip =yang muncul di depan argumen perintah (di sini sendiri)
  • var =23, varperintah dengan =23argumen (kecuali di zshmana =somethingada operator khusus yang meluas ke jalur somethingperintah. Di sini, Anda mungkin akan mendapatkan kesalahan karena 23tidak mungkin menjadi nama perintah yang valid).
  • var= 23: tugas yang var=diikuti oleh nama perintah 23. Itu dimaksudkan untuk mengeksekusi 23dengan var=diteruskan ke lingkungannya ( varvariabel lingkungan dengan nilai kosong).
  • var = 23, varperintah dengan =dan 23sebagai argumen. Coba dengan echo = 23misalnya.

Keluarga Csh

cshdan tcsh. Tugas variabel ada dengan set var = valuesintaks untuk variabel skalar, set var = (a b)untuk array, setenv var valueuntuk variabel lingkungan, @ var=1+1untuk penilaian tugas dan aritmatika.

Begitu:

  • var=23hanya menjalankan var=23perintah.
  • var =23memohon varperintah dengan =23sebagai argumen.
  • var= 23memohon var=perintah dengan 23sebagai argumen
  • var = 23memohon varperintah dengan =dan 23sebagai argumen.

Keluarga Rc

Itu rc, esdan akanga. Dalam shell tersebut, variabel adalah array dan tugas dengan var = (foo bar), dengan var = foomenjadi kependekan var = (foo)(array dengan satu fooelemen) dan var =kependekan var = ()(array tanpa elemen, gunakan var = ''untuk array dengan satu elemen kosong).

Dalam kasus apa pun, ruang kosong (spasi atau tab) di sekitarnya =diizinkan dan opsional. Jadi dalam shell tersebut 4 perintah itu sama dan setara var = (23)untuk menetapkan array dengan satu elemen 23.

Ikan

Dalam fish, sintaks penugasan variabel adalah set var value1 value2. Seperti dalam rc, variabel adalah array.

Jadi perilakunya akan sama dengan csh, kecuali itu fishtidak akan membiarkan Anda menjalankan perintah dengan =namanya. Jika Anda memiliki perintah tersebut, Anda perlu untuk memohon melalui shmisalnya: sh -c 'exec weird===cmd'.

Jadi semua var=23dan var= 23akan memberi Anda kesalahan, var =23akan memanggil varperintah dengan =23sebagai argumen dan var = 23akan memanggil varperintah dengan =dan 23sebagai argumen.

Stéphane Chazelas
sumber
8

var=23menugaskan 23 ke variabel var.

var =23mencoba menjalankan perintah (atau alias, atau fungsi) vardengan argumen=23

var = 23juga, tetapi argumen =dan23

var= 23set varvariabel environment ke string kosong, lalu jalankan perintah23

Ya, shell aneh sebagai bahasa pemrograman. Tapi itu masuk akal sebagai shell untuk penggunaan interaktif, di mana spasi memisahkan perintah dan argumen. Kebanyakan "karakter khusus" ( =dalam hal ini) hanya memiliki arti khusus di posisi tertentu, untuk memungkinkan argumen yang hampir sewenang-wenang untuk perintah. Lihat interpretasi di atas.

vonbrand
sumber
3
  • var=23 adalah sintaks yang benar untuk menetapkan nilai ke variabel.
  • var =23dianggap sebagai perintah vardengan =23opsi / argumen untuk perintah var(Meskipun sintaks yang benar / standar untuk argumen / opsi adalah -optionatau --option)
  • var= 23tidak akan memberikan apa pun varsebagai ruang putih memecah proses penugasan dan 23akan dianggap sebagai perintah lain. Solusinya adalah var=\ 23atau var=' 23'untuk menyimpan ruang putih.
  • var = 23memiliki efek yang sama seperti yang dibahas dalam 2 nd kasus.

    Sebenarnya jenis penggunaan ruang sekitar =ini biasanya digunakan dalam kondisi pengujian di dalam [[ ]]. Contoh untuk Bash:

    string1 = string2
           True if the strings are equal.  = should be used with the test command  for  POSIX  conformance.  
           When used with the [[ command, this performs pattern matching as described above (Compound Commands).

Dan setelah semua perilaku ruang putih di sekitar =tergantung pada shell Anda dan bahasa pemrograman.

Pandya
sumber