2013-03-27 19 views
17

kullanarak eğer yazdım işlevideyimin ve arama işlevin bash

check_log(){ 
    if [ -f "/usr/apps/appcheck.log" ] 
    then 
     return 1 
    else 
     return 0 
    fi 
} 

sonra eğer durum

if [ check_log ]; 
then 
    ........statements.... 
fi 

olacak bu işte bu işlevi çağırmak olur? Kafam karıştı, çünkü bash geri dönüşünde başarı 0 ve başarısızlık durumunda 1. Ama işlevim 1'e dönüyor ve durum 1/0'ı kontrol ediyor, 1 oluyor ve hatalar vermeli, ancak kabuk komutumun durumu geçiyor.

Bu konudaki herhangi bir ışıktan kimse var mı?

Teşekkürler!

+0

[bir sayı] bir şey yaparsa ve [0] – JumpOffBox

+0

hiçbir şey yapmazsa bir sayıdan bahsedersek, bunun için sayısal bir bağlam kullanırsınız - değil [[] 'veya' [[]] 'ancak (()) '- gibi:' if ((değişken)); o zaman ... 'değişken' 0'dan büyük bir sayı içeriyorsa true olarak değerlendirecektir. –

+0

... bu arada, "bash kullanarak", shebang'ınızın "#!/bin/bash" veya " #!/usr/bin/env bash 'değil, # #!/bin/sh'; ikincisiyse, tüm bash özellikleri etkin olmayacaktır, bu yüzden burada verilen tüm tavsiyeler geçerli olacaktır. –

cevap

35
if [ check_log ]; 

köşeli parantezleri sen test komutu çağırarak ediyoruz kullandığınızda. Bu, if test -n check_log için kestirme olan if test check_log'a eşdeğerdir, bu da ""check_log" boş bir dize değilse" anlamına gelir. check_log işlevinizi çağırmıyor.

check_log() { 
    ! [ -f "/usr/apps/appcheck.log" ] 
} 

bir fonksiyonun geri dönüş değeri son komutun çıkış durumudur: Buna

Değişim it: olarak arada

if check_log; 

, fonksiyon daha basitçe yazılmış olabilir bu nedenle açık beyannamelere gerek yok.

@ John-kugelman, bir çözeltisi (ve belki de en uygun bir) tarafından belirtildiği gibi
+0

Bir [6] bir şey yaparsanız ve [0] – JumpOffBox

+0

@JumpOffBox bir şey yapmazsanız, bir hakkında bir bilgi varsa, sayısal testler yapmak istiyorsanız, test komutunun sayısal işleçlerinden birini kullanmanız gerekir, örneğin, eğer [6 -ne 0]; o zaman ... Ancak, bu sayılardan birinin yerine bir işlevi kullanamayacağınızı unutmayın; Bir kabuk işlevini bir komut olarak düşünün (başarılı veya başarısız olabilir), matematiksel bir işlev gibi değil (temel amacı bir değer döndürmek). –

+0

@GordonDavisson Lütfen,/bin/sh yerine bash'ı açıkça hedefleyen birisi için [] 'i önermeyin; '((7! = 0))' çok daha okunabilir (ve aynı zamanda daha az hataya eğilimli; '(())', '[[]]' gibi, dizge bölme ve glob genişlemesini bastıran, tırnak işaretleri değil ifadelerin beklenmedik veri değerleriyle bile tasarlandığı şekilde ayrıştırıldığından emin olmak için gereklidir). –

3

aşağıdaki sözdizimini kullanmaktır:

if check_log; 

Ancak alternatif bir çözüm:

if [[ $(check_log; echo $?) -eq 0 ]]; 

Kişisel tercihim, şartlı ifadeler arasında tutarlılığı arttırdığı için ikinci tercihtir. Ancak olumsuz olan, 'un komut ikamesi gerektirdiğinden, ilk yöntemin yapamayacağı bir çocuk sürecini (yani bir alt kabuk) engelleyecektir.

konuyla ilgili ilginç bir okuma burada bulunabilir:

When does command substitution spawn more subshells than the same commands in isolation?

Güncelleme (2017/10/20): Bu ikinci yöntem için tercihimi Strikeout gün hattayım gereksiz forking önlemek için bir görev. İlk çözümdeki sözdizimi kabuk dışı programlama için sezgisel değil, ama kesinlikle daha verimli.

+0

Neden dünyada ikinci olanı tercih edersin? –

+0

@JohnKugelman Öneriniz için önerimi güncelledim. – markeissler