7

特定のファイルが存在する場合に条件付きで実行する必要があるbashスクリプトに取り組んでいます。これは複数回発生しているため、次の関数を抽象化しました。

function conditional-do {
    if [ -f $1 ]
    then
        echo "Doing stuff"
        $2
    else
        echo "File doesn't exist!"
    end
}

さて、これを実行したいときは、次のようにします。

function exec-stuff {
    echo "do some command"
    echo "do another command"
}
conditional-do /path/to/file exec-stuff

問題は、実行するコマンドのグループの関数と、最初の関数を呼び出すという2つのことを定義していることに悩まされていることです。

このコマンドブロック(多くの場合2つ以上)をクリーンな方法で「条件付き実行」に直接渡したいのですが、これがどのように実行可能か(または可能かどうか)わかりません...誰かが持っていますか何か案は?

注意してください、私はそれが読みやすい解決策である必要があります...そうでなければ私はむしろ私が持っているものに固執したいと思います。

4

3 に答える 3

6

これは、ほとんどのCプログラマーが読めるはずです。

function file_exists {
  if ( [ -e $1 ] ) then 
    echo "Doing stuff"
  else
    echo "File $1 doesn't exist" 
    false
  fi
}

file_exists filename && (
  echo "Do your stuff..."
)

またはワンライナー

file_exists filename && echo "Do your stuff..."

さて、本当に関数からコードを実行したいのであれば、これはあなたがそれを行うことができる方法です:

function file_exists {
  if ( [ -e $1 ] ) then 
    echo "Doing stuff"
    shift
    $*
  else
    echo "File $1 doesn't exist" 
    false
  fi
}

file_exists filename echo "Do your stuff..."

しかし、私はその解決策が好きではありません。なぜなら、最終的にはコマンド文字列のエスケープを行うことになるからです。

編集:「eval$*」を$*に変更しました。実際には、評価は必要ありません。bashスクリプトで一般的であるように、それは私がビールを数杯飲んだときに書かれました;-)

于 2008-09-19T21:59:13.700 に答える
0

1つの(おそらくハックする)解決策は、別々の関数を別々のスクリプトとしてまとめて保存することです。

于 2008-09-19T21:56:27.263 に答える
0

標準的な答え:

[ -f $filename ] && echo "it has worked!"

または、本当にしたい場合は、それをまとめることができます:

function file-exists {
    [ "$1" ] && [ -f $1 ]
}

file-exists $filename && echo "It has worked"
于 2008-09-21T12:37:53.407 に答える