glob変数は二重引用符で囲む必要があります。

glob変数は二重引用符で囲む必要があります。

このリンク:引用符内のワイルドカード文字 私の場合、問題は解決されませんでした。
「a.sh」ファイルには以下が含まれます。

file="path with wildcard*"

"b.sh"ファイルには次のものが含まれます。

. a.sh
[ -f "$file" ] && echo ok

なぜなら

"$file"

ワイルドカード文字を拡張しませんが、代わりに

$file

ワイルドカードを拡張しましたが、エラーが発生しました:「バイナリ演算子が必要です」

このジレンマをどのように解決しますか?二重引用符からワイルドカード文字を抽出することはできません。

編集:
ワイルドカードを介して単一の一致を達成したいと思います。一致するものがあれば、条件はfalseを返し、とにかくエラーを返す必要があります。

ベストアンサー1

に保管したい場合大量にglobパターン拡張で作成されたファイルのリストは、次の変数に保存されますbash

pattern='path with wildcard*'

IFS= # disable splitting

shopt -s nullglob # make globs that don't match any file expand to nothing
                  # instead of the unexpanded pattern.

files=($pattern) # here using split+glob (unquoted expansion in list context)
                 # with the splitting disabled above.

または、スカラー変数を$files使用せずに配列を直接割り当てます。$pattern

shopt -s nullglob # make globs that don't match any file expand to nothing
                  # instead of the unexpanded pattern.

files=('path with wildcard'*)

その後、次を使用してリストが空であることをテストできます。

if [ "${#files[@]}" -gt 0 ]; then
  echo it did find some files
fi

これらのファイルの1つ以上が通常のファイルであることを確認するには(シンボリックリンクを確認した後)、次の手順を実行できます。

has_regular_files() {
  local file
  for file do
    [ -f "$file" ] && return
  done
  false
}

if has_regular_files "${files[@]}"; then
  echo there was at least one regular file in the list
fi

1つのファイルにのみ一致し、そのファイルが通常のファイルであることを確認するには、次の手順を実行します。

if [ "${#files[@]}" -eq 1 ] && [ -f "${files[0]}" ]; then
  echo one and only one file matches and it is regular.
fi

1 つ以上の一般ファイルと一致し、一致するすべてのファイルが一般ファイルであることを確認するには、次の手順を実行します。

only_regular_files() {
  [ "$#" -gt 0 ] || return
  local file
  for file do
    [ -f "$file" ] || return
  done
}

if only_regular_files "${files[@]}"; then
  echo at least one regular file and all are regular.
fi

シェルでは、zshglob修飾子を使用してファイル形式で一致させることができます。

if ()(($#)) $~pattern(N-.); then
  print at least one regular file in the expansion of the pattern.
fi
  • 対照的にbashzsh引用符のない引数拡張では暗黙の分割+globは実行されません。ここではワイルドカードを要求します(分割ではありません)$~pattern
  • globがファイルと一致しない場合はテストできないように拡張するように(N-.)glob修飾子を追加します。Nnullglob.定期的な-テストを完了するには、ファイルのみ(他の種類のファイルを除く)後ろにSymlinkの確認により、シンボリックリンクであるファイルを通常のファイルと一致させます(予想通り[ -f "$file" ])。
  • globの拡張は匿名関数に引数として渡されます。() {body} argsここで{body}isです。(($#))
  • ((expr))式がゼロ以外の数値で評価された場合はtrueを返すkshスタイルの算術式評価演算子です。ここで、式は$#位置引数の数に拡張される特別なパラメータです。この場合、この glob 拡張で生成されたファイル数である匿名関数の位置引数の数です。

おすすめ記事