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.