Bash değişkeni atamasında komut bulunamadı


520

Test.sh adlı bu komut dosyası var:

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

koştuğumda bunu sh test.shalıyorum:

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

Neyi yanlış yapıyorum? Ben son derece temel / yeni başlayanlar bash betik öğreticiler çevrimiçi bakmak ve bu nasıl değişkenleri beyan derler ... Yani ne yaptığımı emin değilim.

Ubuntu Server 9.10 kullanıyorum. Ve evet, bash yer almaktadır /bin/bash.


49
Soruyu sorduğunuza sevindim, orada tek bash noob değilsiniz!
Miller the goril

6
Bu soruyu sorduğunuz için teşekkürler. Bu utanacak bir soru değil. Gece geç saatlerde ofiste çalışıyorum ve bunu cevaplamak için çevremde hiçbir Bash uzmanı yok.
Adway Lele

3
Bu günlerde (neredeyse yedi yıl sonra!) Kabuk adı verilen ve bu ve diğer yaygın sözdizimi sorunlarını otomatik olarak tespit edecek bir FOSS linter / analizörü var . Çevrimiçi olarak kullanılabilir veya çevrimdışı olarak kurulabilir ve düzenleyicinize entegre edilebilir.
diğer adam


: Ben kullanılacağını öneriyoruz #!/usr/bin/env bashyerine doğrudan koyma #!/bin/bashkesinlikle emin olmadıkça bashiçindedir /binçünkü: bu cevabın stackoverflow.com/a/21613044/3589567
Alejandro Blasco

Yanıtlar:


929

'=' İşaretinizin çevresinde boşluk olamaz.

Yazarken:

STR = "foo"

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

Yazarken:

STR =foo

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

Yazarken:

STR= foo

bash, STR komutunu ortamındaki boş dizeye ayarlayarak komut foo'yu çalıştırmayı dener.

Bunun açıklığa kavuşturmaya yardımcı olup olmadığından veya sadece gizleme olup olmadığından emin değilim, ancak şunu unutmayın:

  1. İlk komut ile tamamen aynıdır: STR "=" "foo",
  2. ikincisi ile aynı STR "=foo",
  3. ve sonuncusu eşittir STR="" foo.

Sh dil spesifikasyonunun ilgili bölümü , bölüm 2.9.1 :

"Basit komut", herhangi bir sırada isteğe bağlı olarak değişken atamaları ve yeniden yönlendirmelerden oluşan bir dizidir ve isteğe bağlı olarak bir kontrol operatörü tarafından sonlandırılan kelimeler ve yeniden yönlendirmeler gelir.

Bu bağlamda a word, bash'ın çalışacağı komuttur. İçeren herhangi bir dize =, bir yönlendirme değil ve içermez does herhangi bir dize ise bir yönlendirme değil (dizenin başında dışında herhangi bir pozisyonda), değişken bir atama olduğunu =bir komuttur. In STR = "foo", STRdeğişken bir atama değildir.


2
"-" ifadesi içeren bir değişkene sahipseniz, aynı hata oluşur. Bu durumda, çözüm "-"
chomp

1
chomp @ pubs.opengroup.org/onlinepubs/9699919799 , bölüm 2.10.10, kural 7b'de "'' işaretinden önceki tüm karakterler geçerli bir ad oluşturuyorsa (bkz. XBD Adı), simge ASSIGNMENT_WORD döndürülecektir." Pubs.opengroup.org/onlinepubs/9699919799 , 3.231 numaralı bölüme olan bağlantıyı takiben, "Kabuk komut dilinde, yalnızca taşınabilir karakter kümesindeki alt çizgi, rakam ve alfabetik sözcüklerden oluşan bir sözcük buluyoruz. Bir adın ilk karakteri bir rakam değil. " Dolayısıyla, sözcük geçerli bir ad FOO-BAR=quxolmadığı için değişken bir atama FOO-BARdeğildir.
William Pursell

2
Yeni başlayanlar için her zaman ortak bir konuya bu açık açıklamayı ödüllendirmek için bir ödül teklif ediyorum (ve aynı zamanda bağlantı kurmak istediğimde daha hızlı bulabilmek için: D). İşleri bu kadar kolay yaptığınız için teşekkürler!
fedorqui 'SO

1
@fedorqui Teşekkürler! Bunun açık bir açıklama olduğuna tamamen ikna olmadım ve genellikle daha basit hale getirilip getirilemeyeceğini merak ediyorum.
William Pursell

159

İşaretin etrafındaki boşlukları bırakın =:

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

9
Yine de bu, set foo = barWindows toplu iş dosyalarında da yaygın bir hata olduğu için komiktir - ve toplu iş dili bunun için alay edilir ;-)
Joey

Teşekkürler @joey. Ben "=" sonra boşluk değişkenleri başlatan bir kabuk komut dosyası yazma sıkışmış.
Günümü

Neden bash sol alanda sayı kabul etmiyor? 3 = "Merhaba Dünya" gibi, komut bulunamadığından şikayet ediyor
Freedo

6

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 boşluk =olması durumunda etkileşimli modda hata verir.

'Str' komutu bulunamadı


2
Ancak OP'nin söylediğini unutmayın STR = "Hello World", bu yüzden bu cevap burada geçerli değildir.
fedorqui 'SO

@Arkapravo interaktif modun anlamı nedir, $işareti ile ilgisi var
Kasun Siyambalapitiya

@KasunSiyambalapitiya "interaktif mod" ile bu komutları bir komut dosyasına değil, gerçek terminalde yazmak anlamına gelir.
numbermaniac

5

Bunun çok kaliteli bir cevapla cevaplandığını biliyorum. Ama kısacası, alanınız olamaz.

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

Eşittir işareti etrafında boşluk nedeniyle işe yaramadı. Eğer koşacak olsaydın ...

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

İşe yarar


2

Herhangi bir değişkeni tanımladığınızda fazladan boşluk koymak zorunda kalmazsınız.

Örneğin

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

Bu yüzden boşlukları kaldırın:

name="Stack Overflow" 

ve iyi çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.