Bash'de dize karşılaştırması. [[: bulunamadı


166

Ben bash dizeleri karşılaştırmak çalışıyorum. Stackoverflow üzerinde nasıl yapılacağına dair bir cevap buldum . Ben denemekte, ben bahsedilen soru Adam tarafından gönderilen kodu kullanıyorum:

#!/bin/bash
string='My string';

if [[ "$string" == *My* ]]
then
  echo "It's there!";
fi

needle='y s'
if [[ "$string" == *"$needle"* ]]; then
  echo "haystack '$string' contains needle '$needle'"
fi

Ben de 2. yazı bulabilirsiniz ubuntuforums yaklaşım denedim

if [[ $var =~ regexp ]]; then
  #do something
fi

Her iki durumda da hata alıyorum:

[[: not found

Neyi yanlış yapıyorum?


Yanlış yapabilirdim, ama tek bir köşeli parantez kullanmak her zaman benim için çalıştı.
Markus Unterwaditzer

1
Ne /bin/bash --versionyazdırıyor?
themel

4
[bu durumda çalışmaz, çünkü kalıpları desteklemez.
Ansgar Wiechers

Yanıtlar:


158

[[bir bash yapılıdır. Sizin /bin/bashgerçek bir bash olmak görünmüyor.

Bir yorumdan:

#!/bin/bashDosyanın en üstüne ekle



5
Koşarken de aynı sonucu /bin/bash -c "type [["mu alıyorsun ?
Ansgar Wiechers

43
#!/bin/bash
Dosyamın

12
Bana yaz çünkü senaryoyu shçok hayal kırıklığı için çalıştırdım. Şimdi sadece bu cevabı bulmadan önce bulduğum her şeyi tekrarlamalıyım.
Louis Loudog Trottier

174

Senaryonuzu nasıl çalıştırıyorsunuz? Eğer yaptıysan

$ sh myscript

denemelisin:

$ bash myscript

veya komut dosyası yürütülebilirse:

$ ./myscript

sh ve bash iki farklı kabuktur . İlk durumda betiğinizi sh yorumlayıcısına argüman olarak iletirken, ikinci durumda hangi yorumlayıcının kullanılacağına ilk satırda karar verirsiniz.


bu şekilde izin aldım. sudo ./myscript ile komutu bulunamadı
user1581900

11
do chmod + x myscript sonra tekrar çalıştırın sudo'yu gerek yok
Akos K

2
Senaryoyu nasıl çağırıyorsun?
Akos K

dediğin gibi. normalde '$ sh myscipt.sh' ile çağırıyorum. Chmod + x myscript.sh yaptıktan sonra 2. kez ./myscript.sh ile aradım
user1581900

5
Komut dosyasını üzerinden çalıştırdığınızda hata bekleniyor sh myscript.sh, çünkü yerleşik olmayan bir /bin/shBourne kabuğuna [[öykünüyor. Bununla birlikte, komut dosyasını çalıştırmak ./script.shbir hata vermemelidir, çünkü bu durumda shebang /bin/bashkullanılmalıdır.
Ansgar Wiechers

81

Senaryonuzdaki ilk satır:

#!/bin/bash

veya

#!/bin/sh

sh kabuğu bash değil, bu hata iletilerini üretir


1
İlk satır da yazarın bahsettiği hatayı üreten benim için eksikti!
İsimsiz

14

Heroku Toolbelt'i kurarken bu sorunu yaşadım

Sorunu bu şekilde çözdüm

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15  2012 /bin/sh -> dash

Gördüğünüz gibi, / bin / sh "tire" (bash değil) için bir bağlantıdır ve [[bash sözdizimsel şeklidir. Bu yüzden / bin / bash bağlantısını değiştirdim. Sisteminizde böyle rm kullanarak dikkatli olun!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh

6
Dağıtımınız için varsayılanın geçersiz kılınması shIMHO'ya kötü bir şekilde tavsiye edilir. Çalıştırılan bir kabuk ile shçalışmalıdır dash; değilse, bu komut dosyasında bir hata. Eğer gerekiyorsa bashözelliklerini, kullanım bash, değil sh.
tripleee

4
bu kulağa korkunç geliyor
MrVaykadji

2
Katılıyorum, bu sadece çirkin bir çözümdü. Benzer ama daha iyi bir çözüm update-alternatives(debian-tabanlı- linux'da ) bu justinconover.wordpress.com/2012/05/14/… gibi kullanmak olacaktır, ama sonunda aynı olurdu.
jperelli

13

@Ansgar'ın belirttiği gibi [[, bir bashizmdir, yani Bash içine yerleştirilmiştir ve diğer kabuklar için mevcut değildir. Betiğinizin taşınabilir olmasını istiyorsanız kullanın [. Karşılaştırmalar Ayrıca farklı bir sözdizimi gerekir: değişikliğini ==için =.


Ubuntu 16.04 ve (sh ->) tire 0.5.8-2.1ubuntu2 ile biraz kontrol etti ve ["-eq" ve alikes ile birlikte iyi çalışıyor. Bu bağlam için karşılaştırma işleçlerine benzer bilgiler burada bulunabilir: stackoverflow.com/questions/10849297/… - Bir sonraki bağlantıda önerildiği gibi (()) değerlendirme operatörü ile daha fazla bilgi aldım, ancak minimal invaziv değişikliklerim için başarısız görünüyordu / veya / çok daha derin bir kod değişikliğine ihtiyaç duyar. softpanorama.org/Scripting/Shellorama/Control_structures/…
Alexander Stohr

3

Komut dosyasını çalıştırırken sh yerine bash değerini belirtin. Şahsen onlar ubuntu 12.10 altında farklı olduğunu fark ettim:

bash script.sh arg0 ... argn


Bu benim için düzeltildi!
Djamillah
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.