Soru Bash değişken atamasında komut bulunamadı hatası


Test.sh adlı bu betiğe sahibim:

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

koştuğumda sh test.sh Bunu anladım:

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

Neyi yanlış yapıyorum? Ben son derece basit / yeni başlayanlar bash betik öğreticiler online bakmak ve bu nasıl değişkenler beyan etmek için söylüyorum ... Bu yüzden yanlış yapıyorum emin değilim.

Ubuntu Server 9.10'dayım. Ve evet, bash /bin/bash.


400
2018-02-15 18:32


Menşei


Soruyu sorduğuna sevindim, oradaki tek şeyh değilsin! - miller the gorilla
Bu soruyu sorduğun için teşekkürler. Bu, utanılacak bir soru değil. Gecenin geç saatlerinde ofisimde çalışıyorum ve etrafımdaki Bash uzmanı bu soruya cevap verecek. - Adway Lele
Bu günlerde (neredeyse yedi yıl sonra!) Bir FOSS linter / analyzer var. shellcheck Bu ve diğer ortak sözdizimi sorunlarını otomatik olarak algılayacak. Çevrim içi veya çevrimdışı olarak kullanılabilir ve editörünüze entegre edilebilir. - that other guy
Ayrıca bakınız stackoverflow.com/questions/26971987/... - tripleee
Kullanmanızı öneririm: #!/usr/bin/env bash doğrudan koymak yerine #!/bin/bash kesinlikle emin değilseniz bash içinde /bin bu cevap yüzünden: stackoverflow.com/a/21613044/3589567 - Alejandro Blasco


Cevaplar:


'=' İşaretinin etrafında boşluk olamaz.

Yazarken:

STR = "foo"

bash, 2 argümanla STR adlı bir komutu çalıştırmaya çalışır ('=' ve 'foo' dizeleri)

Yazarken:

STR =foo

bash 1 argümanıyla STR adlı bir komut çalıştırmayı dener ('= foo' dizesi)

Yazarken:

STR= foo

bash, komut foo'yu, kendi ortamındaki boş dizeye ayarlanmış STR ile çalıştırmayı dener.

Bunun açıklığa kavuşturulmasına yardımcı olup olmadığından emin değilim, ya da sadece bir karalama olup olmadığına emin değilim, ama şunu unutmayın:

  1. ilk komut tam olarak aşağıdakilere eşittir: STR "=" "foo",
  2. ikinci aynı STR "=foo",
  3. ve sonuncusu eşdeğerdir STR="" foo.

İlgili bölüm sh dil özellikleri, bölüm 2.9.1 devletler:

Bir "basit komut", isteğe bağlı olarak bir kontrol operatörü tarafından sonlandırılan sözcükler ve yönlendirmeler tarafından izlenen isteğe bağlı değişken atamaları ve yönlendirmeleri dizisidir.

Bu bağlamda, word bash'ın koşacağı komuttur. İçeren herhangi bir dize = (yönlendirme başlangıcı dışında herhangi bir konumda) bir yönlendirme değil, bir değişken atamasıdır, bir yönlendirme olmayan ve içermeyen herhangi bir dize = bir komuttur. İçinde STR = "foo", STR değişken ataması değildir.


764
2018-02-15 18:34



"-" harfine sahip bir ada sahip bir değişkeniniz varsa, aynı hata oluşur. Bu durumda, çözüm "-" kaldırmaktır - chomp
chomp @ Kural 2.b.10 pubs.opengroup.org/onlinepubs/9699919799 "'=' Öncesindeki tüm karakterler geçerli bir isim oluşturuyorsa (bkz. XBD Adı), jetonu ASSIGNMENT_WORD geri gönderilecektir." 3.231. pubs.opengroup.org/onlinepubs/9699919799"Kabuk komut dilinde, taşınabilir karakter kümesinden yalnızca alt çizgiler, rakamlar ve alfabetiklerden oluşan bir kelime bulunur. Bir ismin ilk karakteri bir rakam değildir." Yani kelime FOO-BAR=qux o zamandan beri değişken bir görev değildir FOO-BAR geçerli bir isim değil. - William Pursell
Bu açık açıklamayı yeni başlayanlar için her zaman ortak bir konuya ödüllendirmek için bir ödül teklif ediyorum (iyi, ve ayrıca bağlantı kurmak istediğimde daha hızlı bulabilmek için: D). Bu işi kolaylaştırdığın için teşekkürler! - fedorqui
@fedorqui Teşekkürler! Bunun net bir açıklama olduğuna ikna olmadım ve çoğu zaman daha basit yapılabileceğini merak ediyorum. - William Pursell


Etrafındaki boşlukları bırakın = işaret:

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

140
2018-02-15 18:34



Bu komik olsa da set foo = bar Windows toplu iş dosyalarında da yaygın bir hatadır — ve orada toplu iş dili bunun için alay konusu ;-) - Joey
Teşekkürler @joey. "=" İfadesinden sonra boşluklarla değişkenleri başlattığım bir kabuk komut dosyası yazarken sıkışmıştım. Sen benim günümü kurtardın - Lalit Rao
Bash neden sol alanda sayıları kabul etmiyor? 3 = "Merhaba Dünya" gibi, komut bulunamadığı için şikayetçi - Freedo


Etkileşimli modda her şey iyi görünüyor

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

Açıkçası! Johannes'in dediği gibi, '=' etrafında boşluk yok. '=' Etrafında herhangi bir boşluk olması durumunda, etkileşimli modda hatalar verir.

'Str' komutu bulunamadı


6
2018-02-26 06:33



Ama OP'nin söylediğine dikkat et STR = "Hello World"Bu yüzden bu cevap burada geçerli değil. - fedorqui
@Arkapravo interaktif modun anlamı nedir, onunla bir ilgisi var mı $ işaret - Kasun Siyambalapitiya
@KasunSiyambalapitiya "interaktif mod" ile o komutları gerçek betikte bir komut dosyasına yazmaz. - numbermaniac


Herhangi bir değişken tanımladığınızda fazladan boşluk bırakmanız gerekmez.

Örneğin.

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

Yani boşlukları kaldırın:

name="Stack Overflow" 

ve iyi çalışır.


1
2018-06-19 15:16