#!/bin/bash
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path
find $path -type f $open -name $pat $close
上記のコードは find の出力を表示しません。助ける
答え1
pat="'*.ab' -o -name '*.bc'"
find $path -type f $open -name $pat $close
これには望ましい効果はありません。変数の引用符はpat
引用符として扱われず、リテラル文字として扱われます。拡張後、単語$pat
分割が実行され、単語、および'*.ab'
一-o
重引用符がそのまま残ります。したがって、ファイル名に一重引用符が含まれていない場合は一致しません。-name
'*.bc'
path=path
これは変数をpath
リテラル文字列に設定しますpath
が、これはプレースホルダにすぎないと思います。
open="\("
close="\)"
これは変数にリテラルバックスラッシュを入れてfind
引数を受け取ると文句を言うかもしれません\(
。括弧を一度だけ引用すれば十分ですopen="("
。open=\(
式リストを作成する必要がある場合は、配列を含むfind
シェルを使用してください(Bashまたは一般以外のほとんどすべてsh
)。
args=()
args+=( -name "*.ab" )
args+=( -or -name "*.bc" )
find ... \( "${args[@]}" \)
必要に応じて配列構成をループにラップします。
答え2
間違った型の変数を使用し、それを参照するのを忘れました。
これには、複数のパラメータを格納するための配列が必要です。
#! /bin/bash -
pat=('*.ab' -o -name '*.bc')
open='('
close=')'
path=path
find "$path" -type f "$open" -name "${pat[@]}" "$close"
*.ab
OR以外のANDパラメータを渡すことに注意してください。これらの引用符とバックスラッシュはシェル構文の一部です。(
find
'*.ab'
\(
eval
たとえば、これを評価するためにシェルコマンドラインをビルドする場合にのみこれを実行します。
#! /bin/bash -
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path
eval 'find "$path" -type f '"$open -name $pat $close"
次に、シェルに評価を実行させます。
find "$path" -type f \( -name '*.ab' -o -name '*.bc \)
上記のように、find
次のパラメータを使用して呼び出しが発生します。
find
path
(コンテンツ$path
)-type
f
(
*.ab
-o
-name
*.bc
)
答え3
変数を使用する代わりに、単純なアプローチを使用してください。
find $path -type f -name "*.ab" -o \( -name "*.bc" \)