Perintah tidak ditemukan kesalahan dalam penugasan variabel Bash

521

Saya memiliki skrip ini bernama test.sh:

#!/bin/bash
STR = "Hello World"
echo $STR

ketika saya berlari sh test.sh saya mendapatkan ini:

test.sh: line 2: STR: command not found

Apa yang saya lakukan salah? Saya melihat tutorial bash scripting yang sangat dasar / pemula secara online dan ini adalah bagaimana mereka mengatakan untuk mendeklarasikan variabel ... Jadi saya tidak yakin apa yang saya lakukan salah.

Saya di Ubuntu Server 9.10. Dan ya, bash terletak di /bin/bash.

Jake Wilson
sumber
49
Saya senang Anda mengajukan pertanyaan, Anda bukan satu-satunya bash noob di luar sana!
giling gorila
6
Terima kasih telah mengajukan pertanyaan itu. Ini bukan pertanyaan yang membuat malu. Saya bekerja larut malam di kantor & tidak ada ahli Bash di sekitar saya untuk menjawab ini.
Adway Lele
3
Hari-hari ini (hampir tujuh tahun kemudian!) Ada linter / analyzer FOSS yang disebut shellcheck yang akan mendeteksi secara otomatis hal ini dan masalah sintaksis umum lainnya. Ini dapat digunakan online atau diinstal secara offline dan terintegrasi dalam editor Anda.
pria lain itu
Saya akan merekomendasikan Anda untuk menggunakan: #!/usr/bin/env bashdaripada meletakkan langsung #!/bin/bashkecuali Anda benar-benar yakin Anda bashada di /binkarena jawaban ini: stackoverflow.com/a/21613044/3589567
Alejandro Blasco

Jawaban:

929

Anda tidak dapat memiliki spasi di sekitar tanda '=' Anda.

Ketika Anda menulis:

STR = "foo"

bash mencoba menjalankan perintah bernama STR dengan 2 argumen (string '=' dan 'foo')

Ketika Anda menulis:

STR =foo

bash mencoba menjalankan perintah bernama STR dengan 1 argumen (string '= foo')

Ketika Anda menulis:

STR= foo

bash mencoba menjalankan perintah foo dengan STR diatur ke string kosong di lingkungannya.

Saya tidak yakin apakah ini membantu untuk mengklarifikasi atau jika itu hanya kebingungan, tetapi perhatikan bahwa:

  1. perintah pertama adalah persis sama dengan: STR "=" "foo",
  2. yang kedua sama dengan STR "=foo",
  3. dan yang terakhir setara dengan STR="" foo.

Bagian yang relevan dari spesifikasi bahasa sh, bagian 2.9.1 menyatakan:

"Perintah sederhana" adalah urutan penugasan dan pengalihan variabel opsional, dalam urutan apa pun, secara opsional diikuti oleh kata-kata dan pengalihan, diakhiri oleh operator kontrol.

Dalam konteks itu, a wordadalah perintah yang akan dijalankan oleh bash. Setiap string yang berisi =(dalam posisi apa pun selain di awal string) yang bukan merupakan pengalihan variabel adalah penugasan variabel, sedangkan string yang bukan pengalihan dan tidak mengandung =adalah perintah. In STR = "foo", STRbukan tugas variabel.

William Pursell
sumber
2
Jika Anda memiliki variabel dengan nama yang mengandung "-", kesalahan yang sama terjadi. Dalam hal ini, solusinya adalah dengan menghapus "-"
chomp
1
chomp @ Dalam aturan 7b bagian 2.10.10 dari pubs.opengroup.org/onlinepubs/9699919799 "Jika semua karakter yang mendahului '=' membentuk nama yang valid (lihat Nama XBD), token ASSIGNMENT_WORD akan dikembalikan." Mengikuti tautan ke bagian 3.231 dari pubs.opengroup.org/onlinepubs/9699919799 , kami menemukan "Dalam bahasa perintah shell, sebuah kata yang hanya terdiri dari garis bawah, angka, dan alfabet dari set karakter portabel. Karakter pertama dari sebuah nama adalah bukan digit. " Jadi kata FOO-BAR=quxitu bukan tugas variabel karena FOO-BARbukan nama yang valid.
William Pursell
2
Saya menawarkan hadiah untuk menghargai penjelasan yang jelas ini untuk masalah yang selalu umum bagi pemula (well, dan juga untuk dapat menemukannya lebih cepat setiap kali saya ingin menghubungkannya: D). Terima kasih telah mempermudah ini!
fedorqui 'SO stop harming'
1
@ fedorqui Terima kasih! Saya tidak sepenuhnya yakin bahwa ini adalah penjelasan yang jelas, dan saya sering bertanya-tanya apakah itu bisa dibuat lebih sederhana.
William Pursell
159

Jatuhkan spasi di sekitar =tanda:

#!/bin/bash 
STR="Hello World" 
echo $STR 
Joey
sumber
9
Ini lucu, meskipun, seperti set foo = barkesalahan umum dalam file batch Windows juga — dan di sana bahasa batch diejek untuk itu ;-)
Joey
Terima kasih @ joey. Saya terjebak dalam penulisan skrip shell di mana saya menginisialisasi variabel dengan spasi setelah "=". Anda menyelamatkan hari saya
Lalit Rao
Mengapa bash tidak menerima angka di bidang kiri? seperti 3 = "Hello World", ia mengeluh tentang perintah yang tidak ditemukan
Freedo
6

Dalam mode interaktif semuanya terlihat baik-baik saja:

$ str="Hello World"
$ echo $str
Hello World

Jelas (!) Seperti kata Yohanes, tidak ada ruang di sekitar =. Jika ada ruang di sekitar =maka dalam mode interaktif itu memberikan kesalahan sebagai

Tidak ditemukan perintah 'str'

Arkapravo
sumber
2
Tetapi perhatikan OP mengatakan STR = "Hello World", jadi jawaban ini tidak berlaku di sini.
fedorqui 'SO stop harming'
@Arkapravo apa arti dari mode interaktif, apakah itu ada hubungannya dengan $tanda
Kasun Siyambalapitiya
@KasunSiyambalapitiya dengan "mode interaktif" yang ia maksudkan dengan mengetikkan perintah-perintah itu di terminal aktual, bukan ke skrip.
numbermaniac
5

Saya tahu ini telah dijawab dengan jawaban yang sangat berkualitas tinggi. Tapi, singkatnya, Anda tidak punya ruang.

#!/bin/bash
STR = "Hello World"
echo $STR

Tidak berfungsi karena spasi di sekitar tanda sama dengan. Jika Anda menjalankan ...

#!/bin/bash
STR="Hello World"
echo $STR

Itu akan berhasil

Derek Haber
sumber
2

Ketika Anda mendefinisikan variabel apa pun maka Anda tidak perlu memasukkan spasi tambahan.

Misalnya

name = "Stack Overflow"  
// it is not valid, you will get an error saying- "Command not found"

Jadi hapus spasi:

name="Stack Overflow" 

dan itu akan bekerja dengan baik.

Ravi Solanki
sumber