2013-10-18 6 views
8

Bunun gibi bir şeye 1,5 saat harcadığıma inanamıyorum. Ben bir dosya greps, bir değişken içinde çıktı depolar ve değişken STDOUT ecse bir çok basit kabuk komut dosyası yazıyorum.grep iç kabuk betiğini kullanma dosyada hata bulunamıyor

Komut satırındaki regex ile grep komutunu kontrol ettim ve iyi çalışıyor. Ancak bazı sebeplerden dolayı grep komutu kabuk betiği içinde çalışmaz.

#!/bin/bash 

tt=grep 'test' $1 
echo $tt 

aşağıdaki komutla bu koştum:

benım yazdım kabuk script ./myScript.sh testingFile. Sadece boş bir çizgi basıyor.

  • Daha önce chmod kullandım ve betiği çalıştırılabilir yaptım.
  • PATH değişkeninin içinde /bin olduğunu kontrol ettim.
  • echo ${tt}
    • tt=grep 'test' "$1" hiç komut satırı argümanı kullanarak ve adını hardcoding Değil: echo $SHELL Benim çaresizlik içinde /bin/bash
    • verdiğini
    • Doğrulanmış, ben tüm kombinasyonları denedi dosya tt=grep 'test' testingFile
  • Bunu buldum: grep fails inside bash script but works on command line ve hatta olası tüm taşıma iadelerini kaldırmak için dos2unix kullandı.
  • Ayrıca, grep seçeneklerinden herhangi birini kullanmaya çalıştığımda, örneğin: tt=grep -oE 'test' testingFile, bir hata iletisi alıyorum: ./out.sh: line 3: -oE: command not found.
  • Bu delilik.

    #!/usr/bin/env bash 
    
    test=$(grep 'foo' "$1") 
    echo "$test" 
    

    Komut ikamesi komutu kendisi yerine bir komutun çıktısını sağlar:

+0

Yaptığınız şey geçici olarak (yalnızca bu komut için) "tt" ortam değişkenini "grep" dizesine ayarlayarak ve "$ 1" içeriğinden alınan argümanla "test" komutunu çalıştırıyor , ilk komut parametresi) (ve "tt" ortam değişken seti ile) –

cevap

13

komut ikame kullanmak gerekir. Bir komut, bu gibi kapalı olduğunda komut ikame oluşur:

$(command) 

veya bu kullanılarak ters tırnakların gibi

:

`command` 

Bash komut yürütme ve komutunun standart çıkışı ile komut ikamesi değiştirerek genişleme yapar , sondaki tüm satırlar silinir. Gömülü yeni satırlar silinmez, ancak kelime bölme sırasında kaldırılabilirler.

$(command $(command)) 

fazla bilgi için man bash yılında command substitution bölümü okuyun: o yuvalama izin verdiğinden

$() versiyonu

genellikle tercih edilir.

+0

Wow. Çok teşekkür ederim. Sadece merak, bu zsh için farklı mı? – Bonz0