Test programındaki bir borudaki değeri nasıl kullanabilirim?


10
wc -l | test -eq 1

Bu işe yaramıyor. Wc sonucunu 1 değeriyle karşılaştırmak istiyorum. Bunu nasıl yapabilirim?

Yanıtlar:


9

Borularla ilgili sorunuza cevap vermez, ancak yeniden düzenleyebilirsiniz:

test $(ls -l | wc -l) -eq 1 && echo "worked"

Ve SO'da birkaç çözüm var , bu en güzel olanı:

ls -l | wc -l | { read wc; test $wc -eq 7 && echo "woohoo"; }

4

Bash kullanıyorsanız, muhtemelen PIPESTATUS değişkenini araştırmak istersiniz. Bash referans kılavuzunda belirtildiği gibi , PIPESTATUS

En son yürütülen ön plan ardışık düzenindeki (yalnızca tek bir komut içerebilir) işlemlerden çıkış durumu değerlerinin listesini içeren bir dizi değişkeni (bkz. Diziler).

PIPESTATUS ile bu boru hattı için çıkış kodlarının ne olduğunu bulabiliriz:

dmesg | grep -iw 'nnse' | wc -l

Şimdi dizi değişkenini sorgularsanız, ardışık düzende kullanılan komutlara başvurarak çıkış durumlarını alırsınız:

echo ${PIPESTATUS[@]}
0 1 0

(Dizine alınmış bir dizide, diziler her zaman Bash'de 0 ile başladığı için yukarıdaki çıkış kodları dizide 0 1 ve 2 ile temsil edilir.)

Burada ikinci komutun 1 döndürdüğünü ve geri kalan 0 değerini görüyoruz; ancak wc -lsıfır eşleşme varsa 0 döndürür, bu bir hata değildir. Hata sıfır olmayan bir değerle temsil edilir ve komut bulunmayan 127 gibi başka hata değerleri ve yine de ilgili programa özgü olabilecek daha fazla kod vardır.

Boru hattındaki belirli bir komutun çıkış kodunun ne olduğunu görmek istiyorsanız, bu değere erişebilirsiniz. Grep komutu yukarıdaki ardışık düzende ikinci komuttu, ancak diziler 0'dan başladığında birinci girişe ihtiyacımız var.

Bu nedenle, grep komutunun çıkış kodunu bulmak için yukarıdaki boru hattını tekrar çalıştırın (çalıştırırsanız PIPESTATUS içeriği tükendiğinden echo ${PIPESTATUS[@]}) ve ardından aşağıdaki komutu (1'i döndürecek olan) çalıştırın (çıkış kodu):

echo ${PIPESTATUS[1]}
1

Bir komut dosyasında, PIPESTATUS dizi değişkeninin içeriğini aramadan önce boru hattının yürütülmesini tamamladığından emin olun.

PIPESTATUS dizi değişkeninin ilginç kullanımına ilişkin bir örnek için Bash komut gruplaması ve boru durumunu birleştirme ile ilgili bu cevaba bakınız . Dizi değişkenini yorumlarda Gilles tarafından önerilen şekilde test edebilirsiniz, ancak öncelikle boru hattını tekrar çalıştırmanız gerekir:

dmesg | grep -iw 'nnse' | wc -l
[ ${PIPESTATUS[1]} -eq 1 ] && do_something_here

Ne tür bir senaryo tasarladığınızı bilmediğim için bu sadece bir parça, ama umarım PIPESTATUS'u bilmek sizin için yararlı olabilir. PIPESTATUS gibi son derece yararlı olabilecek birçok Bash dizi değişkeni vardır; bkz Bash başvuru kılavuzuna bütün liste için ve bunların kullanımıyla ilgili örnekleri için diğer Stack Exchange siteleri.



1

Bu her testdurumu kapsamaz , ancak normal bir ifade ve grepborulu dize kullanabiliyorsanız, oldukça basittir grep, çünkü testeşleşme bulunmadığında sıfırdan farklı bir çıkışa sahip olması gibi

cat file | wc -l | grep -qE '^\s*1\s*$'

Genişletilmiş düzenli ifadeler, bu tekniği kullanarak birçok vakayı ele almanızı sağlar. Kıkırdamalar için bir test örneği:

for i in 1 11 '' foo; do 
  if echo $i | grep -qE '^\s*1\s*$'; then 
    echo "'$i' matched"
  else
    echo "'$i' didn't match."
  fi
done

çıktılar:

'1' matched
'11' didn't match.
'' didn't match.
'foo' didn't match.
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.