2011-03-11 12 views
12

Benim daha büyük bash komut dosyasının bir parçası olarak aşağıdaki satırı var: komut dosyası çalıştıran üzerineKomut içeride ise bash script ifadesi

if [ `packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` -eq 1 ] 

, alıyorum:

./install.sh : satır 219: [: -eq: beklemede olan operatör beklendi

Satır 219 yukarıdaki satırdır. Bir düzeltme önerisi var mı?

cevap

22

[ aracılığıyla test yerleşimini kullanırken ve sol taraftaki ifadeniz NUL değerini döndürdüğünde bu olur. onun çok daha güzel (()) sözdizimi kullanabilirsiniz zaten bash kullandığınız beri bu sorun var ve yapmaz, hangi

if [ x`some | expression | here` = x1 ]; then 

Veya:

if (($(some | expression | here) == 1)); then 

Sen kullanımı ile bu sorunu giderebilirsiniz

: Ben de
4

[[test_expression]] deneyin; [test_expression] yerine;

if [ -eq 1 ] 

Bunu düzeltmek için kullanılan genel bir yol denklemin her iki tarafında bazı sabit eklenecek olan hiçbir işlenen olur böylece: Komut ikamesi gibi test bakmak yapım etkili bir şey döndürdüğü için

8

hata oluşur herhangi bir zamanda boşaltmak: = kullanılıyor

if [ x`packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` = x1 ] 

Not biz şimdi dizeleri karşılaştırma gibi.

4

kıyaslama her iki tarafında bir "x" ekleyebilir veya sol tarafını alıntı sadece olabilir ikincisi olmayan POSIX olduğu gibi `` ters tırnakların üzerine komuta ikamesi için $() kullanılan ve

kaldırılmış unutmayın
[ "$(command | pipeline)" = 1 ] 

Sonunda ne olduğunu cut ve sed anlamıyorum. Bir boru hattında wc -l çıktısı sadece bir sayıdır.

18

Komutunuzu herhangi bir ek sözdizimi olmadan çalıştırabilirsiniz. Örneğin, grep'in aşağıdaki kontroller çıkış kodu düzenli ifade eşleşir olmadığını belirlemek için:

if ! grep -q "$word" /usr/share/dict/words 
then 
    echo "Word $word is not valid word!" 
fi 
+1

... için – mmey

+0

aradığı şeyi var Yani bu tekniği kullanmak için herhangi bir neden var mı, çünkü öyle çok nadiren bahsetti mi? –

+1

Muhtemelen nedenini kendim buldum: grep ile iyi çalışıyor, ama diğer komutlarla, bu da çıktı verebilir. (ve sadece bir kod döndürmek değil), bu çıktı stdout'a basılacaktır. ''' 'Komutu varsa ne anlama gelir? &/Dev/null; o zaman ... '' '? –