Bashで外部コマンドの可変長引数行を作成する正しい方法

Bashで外部コマンドの可変長引数行を作成する正しい方法

私のスクリプト入力に基づいてさまざまなファイルセットを見つけるには、Bash関数で "find"コマンドを使用する必要があります。

だから私は次のようなものを持っています:

DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
    ;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
    ;;
...
esac
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`

これはうまくいきます。

しかし、次のように変数を使用して日数を検索したいと思います。

DAYS=30
case $1 in
A1) ARGLINE="-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt'"
    ;;
A2) ARGLINE="-name 'PO*xml' -or -name 'PR*xml'"
    ;;
...
esac
if [[ $# -gt 1 ]]; then
    DAYS=$2
fi
find . -maxdepth 1 -type f -mtime +${DAYS} `${ARGLINE}`

この機能が失敗した場合探す一致するファイルが見つかりませんでした。次のエラーが発生しました。

'-name'コマンドが見つかりません。 'coreutils' (デフォルト) パッケージの 'uname' コマンドを意味します。 -name: コマンドが見つかりません。

ただし、findが一部のファイルを見つけるのにかかる日数がこの値に達すると、正常に機能します。成功した実行の出力を別のコマンドにパイプしようとすると失敗します。

「検索」の引数行をどのように適切に設定する必要がありますか?

ベストアンサー1

ではbash配列を使用します。

args=( '(' -name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt' ')' )

)を使用するので、正しいブール論理グループを作成するために追加の括弧が使用されます-or

find次に、コマンドで次の操作を行います。

find ...some arguments... "${args[@]}"

使用するため、追加の問題があります。

`$ARGLINE`

$( $ARGLINE )これは、シェルが$ARGLINE(対応する値)をコマンドとして実行しようとするのと同様のコマンドの置き換えです。これが「コマンド '-name'が見つかりません」というメッセージが表示される理由です。コマンドの置き換えは失敗しますが、find実行されるので「動作する」と思います。

おすすめ記事